如何将油漆事件连接到插槽

How do you connect paintEvent to a slot?

本文关键字:连接 插槽 事件      更新时间:2023-10-16

就像标题说我想将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();
}