如何将paintEvent连接到插槽?

时间:2014-02-08 21:32:31

标签: c++ qt

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

2 个答案:

答案 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();
}