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_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 <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

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT1995

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值