簡體   English   中英

如何將paintEvent連接到插槽?

[英]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 (您可以將其作為子QWidget插入對話框中)並在那里進行渲染。

這是一個簡單的例子....

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM