![](/img/trans.png)
[英]How do I use paintEvent on a QVideoWidget with transparency?
[英]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.