Qt::WA_OpaquePaintEvent理解
Qt助手中對(duì)Qt::WA_OpaquePaintEvent解釋如下:
Indicates that the widget paints all its pixels when it receives a paint event. Thus, it is not required for operations like updating, resizing, scrolling and focus changes to erase the widget before generating paint events. The use of WA_OpaquePaintEvent provides a small optimization by helping to reduce flicker on systems that do not support double buffering and avoiding computational cycles necessary to erase the background prior to painting. Note: Unlike WA_NoSystemBackground, WA_OpaquePaintEvent makes an effort to avoid transparent window backgrounds. This flag is set or cleared by the widget's author.
其含義大體是說:
?指示窗體在收到繪制事件時(shí),繪制它的所有像素。因此,在收到繪制事件之前,對(duì)于更新、大小調(diào)整、滾動(dòng)條滾動(dòng)、焦點(diǎn)更變等操作時(shí),并不要求窗體擦除窗體背景。使用該標(biāo)志對(duì)那些不支持雙緩沖區(qū)的系統(tǒng)提供了小小的優(yōu)化,從而減小閃爍;同時(shí)避免在繪制之前因擦除背景需要計(jì)算而耗費(fèi)時(shí)間。不同于WA_NoSystemBackground標(biāo)志,WA_OpaquePaintEvent 盡量避免窗體背景透明,這個(gè)標(biāo)志是由窗體的開發(fā)者設(shè)置或清除。
以上是Qt官方的解釋。個(gè)人理解如下:
1):?指示窗體在收到繪制事件時(shí),繪制它的所有像素。這里“收到繪制事件”個(gè)人理解應(yīng)該是第一
????????? 次收到繪制事件時(shí),也即窗體構(gòu)建時(shí),就把窗體所有的像素繪制一遍。
2):窗體一旦在完成1)中說的繪制完一遍所有像素后,此后所有有關(guān)窗體的更新、大小改變,焦
???????? 點(diǎn)改變、滾動(dòng)條滾動(dòng)等操作都不會(huì)擦除窗體背景。也就是說以前畫的東西都不會(huì)擦除重繪。
???????? 也就是以前畫的不重新計(jì)算、不重新繪制。當(dāng)以前繪制的東西很費(fèi)時(shí)間時(shí)(如:某個(gè)曲線、
???????? 某個(gè)圖形是經(jīng)過某個(gè)復(fù)雜的數(shù)學(xué)運(yùn)算得出的),不重繪、不重新計(jì)算,這將節(jié)約很多cpu時(shí)間
???????? 大大提高效率(這也就是設(shè)置本標(biāo)志后,不閃爍的原因吧)。
一個(gè)設(shè)置Qt::WA_OpaquePaintEvent標(biāo)志的例子如下:
#include "QtWidgetsApplication1.h" #include<QPainter>QtWidgetsApplication1::QtWidgetsApplication1(QWidget* parent): QWidget(parent) {ui.setupUi(this);setWindowTitle("parent"); }QtWidgetsApplication1::~QtWidgetsApplication1() {}void QtWidgetsApplication1::paintEvent(QPaintEvent* event) {QPainter painter(this);for (int i = 0; i < 1000; ++i){int r = qrand() % 255;int g = qrand() % 255;int b = qrand() % 255;QPen pen(qRgb(r, g, b));pen.setWidth(2);painter.setPen(pen);int x = qrand() % 800;int y = qrand() % 800;// 其實(shí)核心內(nèi)容就是調(diào)用這一個(gè)函數(shù)而已painter.drawPoint(x, y);}}main函數(shù)如下:
#include "QtWidgetsApplication1.h" #include <QtWidgets/QApplication> #include<QTime> #include<QThread>int main(int argc, char *argv[]) {QApplication a(argc, argv);QtWidgetsApplication1 w;w.show();w.setAttribute(Qt::WA_OpaquePaintEvent);QTime timer;{timer.start();// 調(diào)用此函數(shù)即相當(dāng)于Windows中的GetMessage,系列函數(shù),包括了tranlate,分發(fā)函數(shù)等的所有操作// 此處是控制幀數(shù)的關(guān)鍵點(diǎn)while (1){a.processEvents();w.repaint();QThread::sleep(1);}}return a.exec(); }運(yùn)行后彈出窗體如下:
可以看到,窗體背景是黑色即不透明,因?yàn)椴徊脸尘凹床徊脸郧袄L制的,故當(dāng)?shù)?次繪制事件發(fā)生時(shí),繪制1000個(gè)點(diǎn);第2次繪制事件發(fā)生時(shí),再繪制1000個(gè)點(diǎn),那么第N次后,繪制的總點(diǎn)數(shù)為1000*N個(gè)。當(dāng)屏蔽掉上面main.cpp的如下代碼:
w.setAttribute(Qt::WA_OpaquePaintEvent);則窗體背景為正常顏色且每次繪制之前都會(huì)擦除以前繪制的,故N次后窗體依然只有1000個(gè)點(diǎn),如下:
?
總結(jié)
以上是生活随笔為你收集整理的Qt::WA_OpaquePaintEvent理解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: No relevant classes
- 下一篇: Qt::WA_NoMousePropag