就像标题所说我想将paintEvent
连接到一个插槽,以便它可以由计时器触发,我该怎么做?我可以提供你们需要的更多信息,但我对QT很新,所以记住这一点。
编辑:所以我在一个小测试程序中尝试了它,它似乎没有更新。除非我误解paintEvent
如何运作,否则我不知道出了什么问题。这应该在屏幕上从左上角到右下角移动一个黑点(10x10像素)。
这是头文件:
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
#include <QtGui>
#include <QtCore>
namespace Ui {
class Dialog;
}
class Dialog : public QDialog
{
Q_OBJECT
public:
explicit Dialog(QWidget *parent = 0);
~Dialog();
QTimer *timer;
private:
Ui::Dialog *ui;
protected:
void paintEvent(QPaintEvent *e);
};
#endif // DIALOG_H
这是实施文件:
#include "dialog.h"
#include "ui_dialog.h"
#include "windows.h"
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
timer = new QTimer(this);
connect(timer,SIGNAL(timeout()),this,SLOT(update()));
timer->start(1000);
}
Dialog::~Dialog()
{
delete ui;
}
void Dialog::paintEvent(QPaintEvent *e)
{
QPainter painter(this);
QPen pointPen(Qt::black);
pointPen.setWidth(10);
painter.setPen(pointPen);
QPoint test;
static unsigned int coord;
coord = 10;
test.setX(coord);
test.setY(coord);
painter.drawPoint(test);
coord += 10;
}
这是客户端代码:
#include "dialog.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Dialog w;
w.show();
return a.exec();
}
答案 0 :(得分:6)
您无法直接连接到paintEvent
,因为它不是广告位。相反,将定时器信号连接到repaint
(以触发立即重新绘制)或update
(首选方法,因为它合并了多个重绘请求以避免闪烁)。
修改强>
有关更新QDialog
(参见this thread on the Qt forums)的一些怪癖 - 显然,由于Qt版本4.6及更低版本中的错误(以及可能在更高版本中也是如此)。
我会避免在paintEvent
上覆盖QDialog
。而是创建一个自定义QWidget
(您可以将其作为子项插入到对话框中)并在那里执行渲染。
答案 1 :(得分:0)
这是一个简单的例子......
在widget.h文件中...
class Widget:public QWidget
{
Q_OBJECT
QPainter painter;
QTimer timer;
public:
Widget();
void paintEvent(QPaintEvent *);
};
widget.cpp中的
Widget::Widget()
{
connect(&timer,SIGNAL(timeout()),this, SLOT(update()));
timer.start(200);
}
void Widget::paintEvent(QPaintEvent *)
{
painter.begin(this);
painter.drawRect(0,0,100,rand()%200);
painter.end();
}
在main.cpp
中int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}