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当成控控件使用。

程序运行截图如下:

Qt文档阅读笔记-QWindow的进一步认识_第1张图片

LineEdit输入数据后:

Qt文档阅读笔记-QWindow的进一步认识_第2张图片

关键代码如下:

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include "window.h"
#include 

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 
#include 

QT_BEGIN_NAMESPACE
class QPainter;
class QBackingStore;
QT_END_NAMESPACE

class 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 
#include 
#include 
#include 

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

你可能感兴趣的:(C/C++,Qt,文档阅读笔记)