我试图在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...
}
答案 0 :(得分:0)
您可以通知图形场景您的项目内容已更改。您必须在update()
结束时致电advance()
。如果您只是移动项目而不更改其内容,那么您当然不需要调用update()
- 场景会自动检测到此类更改。
答案 1 :(得分:0)
我发现了一些奇怪的东西:
connect(&timer, SIGNAL(timeout()), scene, SLOT(advance()));
显示Widget后需要合并slot,否则slot永远不会被调用!
如 Qt 示例所示,您可以将其组合到主函数中。