Qt文档阅读笔记-QWindow的进一步认识
突然間感覺很慚愧本人Qt開發還差幾個月就有2年時間了(加實習)。一直以為QWidget和QWindow是一個東西。
而最近在研究官方實例的實例,對QWindow有了進一步認識。在此記錄下。
?
QWindow類提供了可視化窗口。
在一般的Qt應用程序中一般都使用QWidget或者QQuickView做UI設計,并不直接使用QWindow。但是QWindow能夠直接渲染QBackingStore和QOpenGLContent。
?
資源管理
窗口程序占用的內存是比較多的。這里有給很意思的點,這個內存大小一般的算法高度,寬度已經顏色深度有關。調用destroy()函數去釋放窗口內存。
?
內容向導
QWindow中reportContentOrientationChange()函數的作用是指定窗口內容的布局。這個僅限于窗口大小的問題。如果是旋轉方面,就需要不同的orientation。
?
可視化及Window
默認情況下窗口是不顯示的。使用setVisible(true)或show()去顯示。隱藏使用setVisible(false)及hide()。IsExposed()判斷窗口是否顯示。exposeEvent()窗口展示是否發送改變。
?
渲染
Qt提供了2個API進行窗口的渲染,QBackingStore使用QPainter渲染,刷新內容使用QSurface::RasterSurface。另外一個API是QOpenGLContext,使用OpenGL進行渲染,使用的Window類型為QSurface::OpenGLSurface。
應用程序在開始渲染時isExposed()返回true,渲染結束后isExposed()返回false。通過重寫exposeEvent()方法可以監聽isExposed()的變化。
?
初始化位置
setGeometry()初始化位置以及大小,如果要固定窗口大小,使用resize()或setWidth()或setHeight()
?
下面是關于QWindow的一個例子
這個例子,使用了QWidget::createWindowContainer把QWindow當成控控件使用。
程序運行截圖如下:
LineEdit輸入數據后:
關鍵代碼如下:
widget.cpp
#include "widget.h" #include "ui_widget.h" #include "window.h" #include <QHBoxLayout>Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget) {ui->setupUi(this);this->setWindowTitle("CSDN IT1995");m_window = new Window;QWidget *widget = QWidget::createWindowContainer(m_window);QHBoxLayout *lay = new QHBoxLayout;lay->addWidget(widget);ui->widget->setLayout(lay);connect(ui->lineEdit, SIGNAL(textChanged(QString)), m_window, SLOT(getMsg(QString))); }Widget::~Widget() {delete m_window;delete ui; }window.h
#ifndef WINDOW_H #define WINDOW_H#include <QObject> #include <QWindow>QT_BEGIN_NAMESPACE class QPainter; class QBackingStore; QT_END_NAMESPACEclass Window : public QWindow {Q_OBJECT public:Window(QWindow *parent = 0);void render(QPainter *painter);void setStr(const QString &str);public slots:void renderLater();void renderNow();void getMsg(const QString &str);protected:bool event(QEvent *event) override;void resizeEvent(QResizeEvent *event) override;void exposeEvent(QExposeEvent *event) override;private:QBackingStore *m_backingStore;QString m_str;};#endif // WINDOW_Hwindow.cpp
#include "window.h" #include <QBackingStore> #include <QPainter> #include <QDebug> #include <QResizeEvent>Window::Window(QWindow *parent): QWindow(parent) {m_str = "heheda";create();m_backingStore = new QBackingStore(this);setGeometry(100, 100, 300, 200); }bool Window::event(QEvent *event){if (event->type() == QEvent::UpdateRequest) {renderNow();return true;}return QWindow::event(event);}void Window::renderLater(){requestUpdate();}void Window::resizeEvent(QResizeEvent *resizeEvent){m_backingStore->resize(resizeEvent->size());if (isExposed())renderNow();}void Window::exposeEvent(QExposeEvent *){if (isExposed())renderNow();}void Window::renderNow(){if (!isExposed())return;QRect rect(0, 0, width(), height());m_backingStore->beginPaint(rect);QPaintDevice *device = m_backingStore->paintDevice();QPainter painter(device);painter.fillRect(0, 0, width(), height(), Qt::white);render(&painter);m_backingStore->endPaint();m_backingStore->flush(rect);}void Window::getMsg(const QString &str){m_str = str;this->requestUpdate();}void Window::render(QPainter *painter){painter->drawText(QRectF(0, 0, width(), height()), Qt::AlignCenter, m_str);}void Window::setStr(const QString &str){m_str = str;}源碼下載地址:
https://github.com/fengfanchen/Qt/tree/master/QWindowBase
總結
以上是生活随笔為你收集整理的Qt文档阅读笔记-QWindow的进一步认识的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java工作笔记-Spring Boot
- 下一篇: Linux学习笔记-消息队列的打开、创建