调用QGraphicsScene :: advance()之后我的项目没有重绘

时间:2015-08-03 20:30:06

标签: c++ qt

我试图在QGrapichScene上做一个简单的动画。我在类中实现了void QGraphicsItem::advance(int),它继承了QGraphicsItem,但在调用advance()后我的项目没有重绘。在colliding mice example它有效。 我做错了什么?

这是我的代码:

widget.h:

class Widget : public QWidget
{
    Q_OBJECT

private:
    QGraphicsScene *scene;
    QGraphicsView *view;
    QHBoxLayout *layout;
    QTimer t;

public:
    Widget(QWidget *parent = 0);
    ~Widget();
};

widget.cpp:

Widget::Widget(QWidget *parent) : QWidget(parent)
{
    layout = new QHBoxLayout(this);

    view = new QGraphicsView(this);
    scene = new QGraphicsScene(0, 0, 400, 400, view);

    scene->addItem(new MyItem());

    view->setScene(scene);
    layout->addWidget(view);

    setLayout(layout);

    connect(&t, SIGNAL(timeout()), scene, SLOT(advance()));

    t.start(100);
}

Widget::~Widget()
{

}

my_item.h:

class MyItem : public QGraphicsItem
{
private:
    QRect bRect;

    enum directon { left, right };

    directon currentDir;

protected:
    virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);

public:
    MyItem(int w = 20);

    virtual void advance(int phase);
    virtual QRectF boundingRect() const
    { return QRectF(bRect); }
};

my_item.cpp:

MyItem::MyItem(int w)
{
    currentDir = right;
    bRect = QRect(0, 0, w, w);
}

void MyItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    qDebug() << "In void MyItem::paint(QPainter*, "
                "const QStyleOptionGraphicsItem*, "
                "QWidget*)";

    painter->fillRect(bRect, Qt::red);
}

void MyItem::advance(int phase)
{
    qDebug() << "In void MyItem::advance(int);"
             << "Phase =" << phase;
    if(!phase) 
        return;
    // Than move item to new positon...
}

2 个答案:

答案 0 :(得分:0)

您可以通知图形场景您的项目内容已更改。您必须在update()结束时致电advance()。如果您只是移动项目而不更改其内容,那么您当然不需要调用update() - 场景会自动检测到此类更改。

答案 1 :(得分:0)

我发现了一些奇怪的东西:

connect(&timer, SIGNAL(timeout()), scene, SLOT(advance()));

显示Widget后需要合并slot,否则slot永远不会被调用!

如 Qt 示例所示,您可以将其组合到主函数中。