我正在尝试在qgraphicsview中实现一个基本的qtimer,但似乎无法让它工作。
这是我的main.cpp代码:
int main(int argc, char * argv[]) {
QApplication app(argc, argv);//should stay on the stack
QGraphicsScene * scene = new QGraphicsScene();//this is the scene -- the canvas that holds everything!
// a view just adds stuff to the scene in that view port
QGraphicsView * view = new Game(scene);//create a new view
return app.exec();
}
这是视图标题...注意qtimer和advance函数
class View: public QGraphicsView {//inherits qwidget -- so we can make it full screen there
Q_OBJECT
public:
View(QGraphicsScene * _scene);//this is responsible for setting up the screen and instantiating several elements
~View();
protected://variables
QGraphicsScene * scene;
QTimer * timer;
protected://functions
int const int_height();//converts qreal to an int
int const int_width();
qreal const height();//
qreal const width();//this is the actual qreal floating point number
virtual void paintEvent(QPaintEvent * event) {};
void timerEvent(QTimerEvent * event) {cout << "HELLO << ads" << endl;};
virtual void keyPressEvent(QKeyEvent * event) {};
virtual void update() = 0;
void advance() { cout << "HELLO WORLD" << endl;}
private:
qreal _height;
qreal _width;
};
最后,我的视图实现构造函数:
View::View(QGraphicsScene * _scene) : QGraphicsView(_scene) {
scene = _scene;//set the scene which is the parent over this
this->showMaximized();
QRectF geometry = this->contentsRect();
_height = geometry.height();
_width = geometry.width();
this->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
this->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
scene->setSceneRect(0, 0, this->int_width(), this->int_height());
// this->centerOn(qreal(0), qreal(0));
this->setGeometry(0, 0, _width, _height);
this->setFixedSize(_width, _height);
timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), scene, SLOT(advance()));
timer->start(1000);
timer->setInterval(100);
}
答案 0 :(得分:1)
您需要将advance()函数声明为头文件中的插槽。否则Qt不知道这个特定的函数是一个插槽:
protected slots:
void advance() { cout << "HELLO WORLD" << endl; }
然后,您将超时信号连接到场景中的advance()插槽 - 但是您在视图中声明了它。正如您当前在视图中一样,您可以使用this
指针将信号连接到视图。像这样更改你的连接:
connect(timer, SIGNAL(timeout()), this, SLOT(advance()));
// ^^^^
[编辑]作为辅助节点:您正在创建Game
类型的QGraphicsView子类,但是您显示了View
的源代码。如果Game
继承自View
,那么这可能无关紧要。