如何将油漆事件连接到插槽
How do you connect paintEvent to a slot?
就像标题说我想将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();
}
您无法直接连接到paintEvent
,因为它不是插槽。相反,将计时器信号连接到repaint
(以触发立即重绘)或update
(首选方法,因为它合并多个重绘请求以避免闪烁)。
编辑
关于更新QDialog
有一些怪癖(请参阅Qt论坛上的此线程) - 显然,由于Qt 4.6及更低版本(也可能在更高版本中)中的错误。
我会避免在QDialog
上覆盖paintEvent
.相反,请创建自定义QWidget
(可以将其作为子项插入到对话框中)并在那里执行渲染。
这里有一个简单的例子....
在小部件.h 文件中...
class Widget:public QWidget
{
Q_OBJECT
QPainter painter;
QTimer timer;
public:
Widget();
void paintEvent(QPaintEvent *);
};
在小部件中.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();
}
在主要.cpp
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
相关文章:
- 升压信号2将插槽传递到成员功能以断开连接
- 如何在qt中将信号和插槽与另一个对象连接 --解决了
- QObject::连接无法将信号连接到*this*对象的插槽
- Qt5:连接:如果插槽的参数少于信号,如何使用"连接"
- 使用std::bind将Qt信号连接到插槽
- 使用信号和插槽连接多个 UI 对象
- 如果代码中没有连接任何插槽,是否有理由发出Qt信号?
- 连接来自 C++98 接口的 Qt 插槽和信号,无需 Qt、STL 或 Boost
- 连接信号(Qstring)白色插槽(字符串)的2个不同类别
- 文档在哪里说明如果参数不是从末端删除参数,则无法从QT信号插槽连接中删除参数?
- 连接 -> 窗口上没有这样的插槽
- 如何将信号连接到类的所有实例的插槽
- 通过排队的QT信号插槽连接发送QSHAREDPOINTERS的QVECTOR
- Qt转发插槽/连接插槽到插槽?
- 信号和插槽的连接(有关QListView)-QT
- 我可以交换QObject儿童保持信号和连接的插槽吗?
- Qt按钮无法连接插槽
- 如何使用C 插槽连接QML信号
- qnetworkAccessManager一个实例并连接插槽
- 在Qt中连接插槽