日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Qt文档阅读笔记-QWindow的进一步认识

發布時間:2025/3/15 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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_H

window.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的进一步认识的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。