Results 1 to 18 of 18

Thread: QGraphicsScene and QGraphicsWidget (reusable and embeddable)

Hybrid View

Previous Post Previous Post   Next Post Next Post
  1. #1
    Join Date
    Jan 2006
    Location
    Warsaw, Poland
    Posts
    33,368
    Thanks
    3
    Thanked 5,018 Times in 4,794 Posts
    Qt products
    Qt3 Qt4 Qt5 Qt/Embedded
    Platforms
    Unix/X11 Windows Android Maemo/MeeGo
    Wiki edits
    10

    Default Re: QGraphicsScene and QGraphicsWidget (reusable and embeddable)

    Quote Originally Posted by OriginalCopy View Post
    my grid widget will have as parent the QGraphicsScene
    Very unlikely as widgets can't have non-widgets as parents.

    It should not be a subclass of QGraphicsScene for the reasons I've mentioned above.
    Could you point out those reasons again? I don't see anything in what you have written so far that would make subclassing the scene a bad idea.
    Your biological and technological distinctiveness will be added to our own. Resistance is futile.

    Please ask Qt related questions on the forum and not using private messages or visitor messages.


  2. #2
    Join Date
    Nov 2007
    Posts
    35
    Thanks
    3
    Thanked 1 Time in 1 Post
    Qt products
    Qt4
    Platforms
    Unix/X11 Windows

    Default Re: QGraphicsScene and QGraphicsWidget (reusable and embeddable)

    I've put it in the title because it's very important: "(reusable and embeddable)" - the grid should be a reusable widget, easy to embed into any scene, even in large number (one scene contains more "grids").

    The natural way of working would be:

    - create new QGraphicsScene
    - create several new MyGrids
    - create some new "objects" (they would be basically QObject subclasses, with some extra features) via bit matrices for each
    - put those several new MyGrids on the scene

    MyGrid would be the class representing the concept of "grid" I've talked about in post #1. It has as children some rectangles managed in turn by a layout (default: QGraphicsGridLayout) for the reasons I've also mentioned in post #1.

    The question is just: What should MyGrid subclass, such that I can reuse as much as possible of the features already existing qt classes provide, to let the user (the real game developer) easily create and manipulate several MyGrid instances as his game requires.

    I hope it's clear now.
    Last edited by OriginalCopy; 4th April 2011 at 11:51.

  3. #3
    Join Date
    Jan 2006
    Location
    Warsaw, Poland
    Posts
    33,368
    Thanks
    3
    Thanked 5,018 Times in 4,794 Posts
    Qt products
    Qt3 Qt4 Qt5 Qt/Embedded
    Platforms
    Unix/X11 Windows Android Maemo/MeeGo
    Wiki edits
    10

    Default Re: QGraphicsScene and QGraphicsWidget (reusable and embeddable)

    Quote Originally Posted by OriginalCopy View Post
    I've put it in the title because it's very important: "(reusable and embeddable)" - the grid should be a reusable widget, easy to embed into any scene, even in large number (one scene contains more "grids").
    So you don't want a widget but rather an item. Or maybe subclasses of QGraphicsLayout.

    The question is just: What should MyGrid subclass, such that I can reuse as much as possible of the features already existing qt classes provide, to let the user (the real game developer) easily create and manipulate several MyGrid instances as his game requires.
    QGraphicsLayout or one of its subclasses, most probably. Although I less and less see what would such grid be useful for and how would it differ from QGraphicsGridLayout.
    Your biological and technological distinctiveness will be added to our own. Resistance is futile.

    Please ask Qt related questions on the forum and not using private messages or visitor messages.


  4. #4
    Join Date
    Nov 2007
    Posts
    35
    Thanks
    3
    Thanked 1 Time in 1 Post
    Qt products
    Qt4
    Platforms
    Unix/X11 Windows

    Default Re: QGraphicsScene and QGraphicsWidget (reusable and embeddable)

    First of all it must be a QGraphicsItem, because:

    Qt Code:
    1. QGraphicsScene::addItem ( QGraphicsItem * item )
    To copy to clipboard, switch view to plain text mode 

    QGraphicsLayout does not seem to be a subclass of QGraphicsItem.

    Although I less and less see what would such grid be useful for and how would it differ from QGraphicsGridLayout.
    It's about the "little extra" I haven't dived into.

    So, can anyone make a real,feasible suggestion, without throwing with classnames at me, please?

  5. #5
    Join Date
    Jan 2006
    Location
    Warsaw, Poland
    Posts
    33,368
    Thanks
    3
    Thanked 5,018 Times in 4,794 Posts
    Qt products
    Qt3 Qt4 Qt5 Qt/Embedded
    Platforms
    Unix/X11 Windows Android Maemo/MeeGo
    Wiki edits
    10

    Default Re: QGraphicsScene and QGraphicsWidget (reusable and embeddable)

    Quote Originally Posted by OriginalCopy View Post
    First of all it must be a QGraphicsItem, because:

    Qt Code:
    1. QGraphicsScene::addItem ( QGraphicsItem * item )
    To copy to clipboard, switch view to plain text mode 
    Qt Code:
    1. QGraphicsWidget *w = new QGraphicsWidget;
    2. w->setLayout(new MyGridLayout);
    To copy to clipboard, switch view to plain text mode 
    So it doesn't have to be a QGraphicsItem.

    It's about the "little extra" I haven't dived into.
    Then maybe you shold dive into it first before you start thinking what class to derive from. There is a really simple question here which you have to answer - what is the thing you are designing to do that QGraphicsGridLayout doesn't already do?
    Your biological and technological distinctiveness will be added to our own. Resistance is futile.

    Please ask Qt related questions on the forum and not using private messages or visitor messages.


  6. #6
    Join Date
    Nov 2007
    Posts
    35
    Thanks
    3
    Thanked 1 Time in 1 Post
    Qt products
    Qt4
    Platforms
    Unix/X11 Windows

    Default Re: QGraphicsScene and QGraphicsWidget (reusable and embeddable)

    Quote Originally Posted by wysota View Post
    Qt Code:
    1. QGraphicsWidget *w = new QGraphicsWidget;
    2. w->setLayout(new MyGridLayout);
    To copy to clipboard, switch view to plain text mode 
    So it doesn't have to be a QGraphicsItem.


    Then maybe you shold dive into it first before you start thinking what class to derive from. There is a really simple question here which you have to answer - what is the thing you are designing to do that QGraphicsGridLayout doesn't already do?
    Specifying objects inside the grid (e.g. a "battleship") via matrices, positioning/rotating those objects on the grid (which are graphically represented as a collection of rectangle objects), receiving signals from these objects (e.g. "battleship") instead of the individual reclangles battleships are made of.

    So yeah, the grid layout looks like a good candidate, except ... you cannot put more of these on the scene.

    The whole thing is for a gaming platform, so it's imperative to have one "widget" which can be manipulated as a standalone entity (friendliness for game developers, one unique API - at some point I may well want to expose this component to scripting languages like python, so it really has to be one object which can be put on the scene).

  7. #7
    Join Date
    Jan 2006
    Location
    Warsaw, Poland
    Posts
    33,368
    Thanks
    3
    Thanked 5,018 Times in 4,794 Posts
    Qt products
    Qt3 Qt4 Qt5 Qt/Embedded
    Platforms
    Unix/X11 Windows Android Maemo/MeeGo
    Wiki edits
    10

    Default Re: QGraphicsScene and QGraphicsWidget (reusable and embeddable)

    Quote Originally Posted by OriginalCopy View Post
    Specifying objects inside the grid (e.g. a "battleship") via matrices, positioning/rotating those objects on the grid (which are graphically represented as a collection of rectangle objects), receiving signals from these objects (e.g. "battleship") instead of the individual reclangles battleships are made of.
    You can do that via any QObject, it doesn't have to be tied to QGraphicsScene in any way hence my original question - what is the rationale behind binding yourself with QGraphicsScene. The fact that a "battleship" is implemented using graphics items (or not) is completely irrelevant. What is relevant is that it emits some signals and has some slots. These will be different for each game so I don't see how your "grid" fits in here. Furthermore usually "pieces" are not standalone objects but are controlled by some kind of engine. Consider chess - you have a board which is a matrix of game pieces. You can move the pieces on the board and capture pieces with other pieces. Yet it is the board (the engine) that decides whether a particular move is legal, where each item is to be positioned, etc. Such items will not emit signals or contain slots as the whole logic is in the engine and not the item.


    So yeah, the grid layout looks like a good candidate, except ... you cannot put more of these on the scene.
    Hmm? You cannot put more of what on the scene? grid layouts? Why not? You can place as many of them as you want.

    The whole thing is for a gaming platform, so it's imperative to have one "widget" which can be manipulated as a standalone entity (friendliness for game developers, one unique API - at some point I may well want to expose this component to scripting languages like python, so it really has to be one object which can be put on the scene).
    According to my experience in games, boards and things like that, what you call a "widget" I would call a "manager" and I would not make it a visual item (widget, graphics item, whatever). It would just manipulate visual items. A game of chess is a game of chess regardless if you display the board somewhere or not. With what you are trying to do, you'd have to display the board, otherwise you wouldn't have the board at all. That's hardly a universal approach. In my opinion you are looking for something like this:
    Qt Code:
    1. class BoardItem : public QObject {
    2. Q_OBJECT
    3. public:
    4. BoardItem(BoardEngine *);
    5. virtual ~BoardItem() = 0;
    6. void setPos(const QPoint &);
    7. QPoint pos() const;
    8. signals:
    9. void positionChanged(QPoint);
    10. };
    11.  
    12. class BoardEngine : public QObject {
    13. Q_OBJECT
    14. public:
    15. void setSize(int w, int h);
    16. void setItem(int x, int y, BoardItem *item);
    17. signals:
    18. void itemPositionChanged(BoardItem*);
    19. };
    To copy to clipboard, switch view to plain text mode 
    etc.
    Your biological and technological distinctiveness will be added to our own. Resistance is futile.

    Please ask Qt related questions on the forum and not using private messages or visitor messages.


  8. #8
    Join Date
    Nov 2007
    Posts
    35
    Thanks
    3
    Thanked 1 Time in 1 Post
    Qt products
    Qt4
    Platforms
    Unix/X11 Windows

    Default Re: QGraphicsScene and QGraphicsWidget (reusable and embeddable)

    Yep, I do intend to sepparate game logic from game view. What I need to be reusable is this manager, as you call it, which should be able to manage "tiles" belonging together (let's call this aggregation of tiles a "pawn") - it is just about the graphical representation, the piece (the qobject you are proposing) itself will take care of the logic and of updating this "pawn" within the manager (or rather, tell the manager update it - thus I think the best place for functions to graphically manipulate "pawns" in all kind of ways is in the manager).

    Hmm? You cannot put more of what on the scene? grid layouts? Why not? You can place as many of them as you want.
    How?

  9. #9
    Join Date
    Jan 2006
    Location
    Warsaw, Poland
    Posts
    33,368
    Thanks
    3
    Thanked 5,018 Times in 4,794 Posts
    Qt products
    Qt3 Qt4 Qt5 Qt/Embedded
    Platforms
    Unix/X11 Windows Android Maemo/MeeGo
    Wiki edits
    10

    Default Re: QGraphicsScene and QGraphicsWidget (reusable and embeddable)

    Quote Originally Posted by OriginalCopy View Post
    it is just about the graphical representation, the piece (the qobject you are proposing) itself will take care of the logic and of updating this "pawn" within the manager
    It should work the other way round. The manager knows the logic of the game, it can delegate some of its resposibility to another object (which can happen to be the visual item drawn on the board but it doesn't have to be) but still the manager is in control of everything. If we continue with the chess parallel - if you want to add a new type of piece to the game then of course the logic of the piece can be tied to the component implementing the looks of the piece but it is still the game engine that asks a particular piece for possible destinations, determines the legality of each of them in the current game state and finally asks the piece to make the move. If you decentralize the logic (as if I correctly understand that that's what you propose) then you have dozens of places that you have to coordinate, dozens of places where something can go wrong, etc. Even if we consider your approach as a sort of an "agent-like" solution then there still has to be an agent controlling the game logic and the agent would be the manager.

    How?
    In general through QGraphicsLayoutItem API.
    Qt Code:
    1. QGraphicsWidget *w = new QGraphicsWidget;
    2. QGraphicsGridLayout *l1 = new QGraphicsGridLayout;
    3. w->setLayout(l1);
    4. QGraphicsGridLayout *l2 = new QGraphicsGridLayout;
    5. l1->addItem(l2, 0, 0);
    6. // ...
    7. QGraphicsWidget *w2 = new QGraphicsWidget;
    8. QGraphicsGridLayout *l21 = new QGraphicsGridLayout;
    9. w2->setLayout(l21);
    10. QGraphicsGridLayout *l22 = new QGraphicsGridLayout;
    11. l21->addItem(l22, 0, 0);
    12. // ...
    To copy to clipboard, switch view to plain text mode 
    Your biological and technological distinctiveness will be added to our own. Resistance is futile.

    Please ask Qt related questions on the forum and not using private messages or visitor messages.


  10. #10
    Join Date
    Nov 2007
    Posts
    35
    Thanks
    3
    Thanked 1 Time in 1 Post
    Qt products
    Qt4
    Platforms
    Unix/X11 Windows

    Default Re: QGraphicsScene and QGraphicsWidget (reusable and embeddable)

    Quote Originally Posted by wysota View Post
    It should work the other way round. The manager knows the logic of the game, it can delegate some of its resposibility to another object
    [/code]
    Yes, this "another object" is the one I want to implement and make reusable.

  11. #11
    Join Date
    Jan 2006
    Location
    Warsaw, Poland
    Posts
    33,368
    Thanks
    3
    Thanked 5,018 Times in 4,794 Posts
    Qt products
    Qt3 Qt4 Qt5 Qt/Embedded
    Platforms
    Unix/X11 Windows Android Maemo/MeeGo
    Wiki edits
    10

    Default Re: QGraphicsScene and QGraphicsWidget (reusable and embeddable)

    The API of this "another object" is strictly tied to the logic of the game. It will be different for chess and different for say... civilization clone.

    For chess I would define something like:
    Qt Code:
    1. class ChessPieceLogic {
    2. public:
    3. virtual ~ChessPieceLogic(){}
    4. virtual QList<QPoint> possibleMoves(const QPoint &from, const BoardState &state) const = 0;
    5. virtual QList<QPoint>attackedFields(const QPoint &from, const BoardState &state) const = 0;
    6. virtual isValidMove(const QPoint &from, const QPoint &to, const BoardState &state) const = 0;
    7. virtual bool isUnderAttackBy(const QPoint &source, const QPoint &target) const; // to check for check/mate
    8. virtual QList<QPair<QPoint,QPoint> > makeMove(const QPoint &from, const QPoint &to, const BoardState &state) const = 0; // to allow en passant and castles
    9. virtual void commitMove(const QPoint &from, const QPoint &to) = 0;
    10. };
    To copy to clipboard, switch view to plain text mode 
    Your biological and technological distinctiveness will be added to our own. Resistance is futile.

    Please ask Qt related questions on the forum and not using private messages or visitor messages.


  12. #12
    Join Date
    Nov 2007
    Posts
    35
    Thanks
    3
    Thanked 1 Time in 1 Post
    Qt products
    Qt4
    Platforms
    Unix/X11 Windows

    Default Re: QGraphicsScene and QGraphicsWidget (reusable and embeddable)

    Yes, but drawing this "other object" and the objects inside it, manipulating those visual representations, reacting to UI events, will be handled (and forwarded) by this "other object". This "other object" is "the grid" i was talking about in post #1, and needs to have the features I've mentioned.

    Now, have we cleared up any misunderstanding?

    Do you (finally) have a real, constructive suggestion about THIS specific issue, without walking me through all the irrelevant things about this entire gaming platform? Because frankly, my problem is a QT issue, and not an overall design issue.

    It would be great if you could help me with that, instead of divagating.

    I do appreciate your input so far, but I would appreciate even more an on-topic discussion.

Similar Threads

  1. Qml in QGraphicsWidget
    By animagani in forum Qt Quick
    Replies: 7
    Last Post: 2nd December 2010, 16:20
  2. QGraphicsWidget and ItemIsMovable()
    By paolom in forum Qt Programming
    Replies: 8
    Last Post: 20th October 2009, 13:25
  3. QTextEdit on a QGraphicsWidget
    By paolom in forum Qt Programming
    Replies: 2
    Last Post: 7th October 2009, 14:08
  4. Positioning QGraphicsWidget
    By jasper_ferrer in forum Qt Programming
    Replies: 3
    Last Post: 22nd September 2009, 14:34
  5. QGraphicsWidget - How does it work?
    By been_1990 in forum Qt Programming
    Replies: 2
    Last Post: 31st July 2009, 13:15

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  
Qt is a trademark of The Qt Company.