突然间感觉很惭愧本人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;
}
源码下载地址: