Qt5下,QWidget系列从QtGui中被剥离出去,成为单独的QtWidget模块。随着Qt Quick2的引入,QtDeclarative也逐渐和QWidget系列也脱离关系。
最终:在Qt5下的GUI编程,有两套不同的东西
这两个是什么东西(我还真说不清)?但我们,
不妨先,从根本的QtGui中的QWindow这个东西开始看起,看看QWindow是如何配合QWidget进行工作的
QWindow
只有QWindow,不用我们熟悉的QWidget,该如何得到一个窗口呢?
例子一
跟着感觉走,我就这样写了,行不行?
#include <QtGui>
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
QWindow w;
w.setGeometry(100, 100, 200, 300);
w.show();
return app.exec();
}
恩,看起来没什么不妥,编译运行,就可以得到一个窗口。大小可拖动,可以关闭。
还可以继续跟着直觉走,尝试子类化一下 QWindow
class Window:public QWindow
{
public:
Window(QWindow *parent=0)
:QWindow(parent)
{
}
protected:
bool event(QEvent *evt)
{
if (evt->type()==QEvent::Expose || evt->type()==QEvent::Resize) {
// What can we do here ??
}
return QWindow::event(evt);
}
};
同样,这种风格是我们很熟悉的东西,
可是,到了这儿,我们如何绘制我们想要的东西呢?
注:同QWidget一样,QWindow下也有
- keyPressEvent()
- resizeEvent()
- showEvent()
- ...
这堆东西,但我们这儿直接用最根本的event()函数。
例子二
在QWidget中,我们有熟悉的QPainter类,它可以在QPaintDevice上进行绘制操作。
现在,我还是想用QPainter,于是,需要认识一个新朋友:QBackingStore
#include <QtGui>
class Window:public QWindow
{
public:
Window(QWindow *parent=0)
:QWindow(parent), m_backingStore(this)
{
}
protected:
bool event(QEvent *evt)
{
if (evt->type()==QEvent::Expose || evt->type()==QEvent::Resize) {
QRect rect(QPoint(), geometry().size());
m_backingStore.resize(rect.size());
m_backingStore.beginPaint(rect);
QPainter p(m_backingStore.paintDevice());
p.setBrush(Qt::blue);
p.drawEllipse(rect);
m_backingStore.endPaint();
m_backingStore.flush(rect);
}
return QWindow::event(evt);
}
private:
QBackingStore m_backingStore;
};
- 创建了一个QBackingStore的实例
- 当收到重绘(Expose)或大小改变(Resize)的事件时,进行重绘
- 将 backingStore 调整和合适的尺寸。(我们此处和窗口一样大)
- 获取相应的 painteDevice()。(比如后台提供的一个QImage图片)
- 用熟悉的QPainter进行熟悉的绘图操作
- 绘图...
- 将绘制的东西送入显存。
QWidget
在Qt5下,我们仍然可以使用QWidget,和Qt4下没有区别。
例子三
QWidget的例子没必要列了(略)
class Widget:public QWidget
{
public:
Widget(){}
protected:
void paintEvent(QPaintEvent*){...}
};
只是,这个东西和前面的QWindow如何关联上呢?
派生类?
QWidgt是QWindow的派生类么?如果是那就简单了,可是
class QWidget : public QObject, public QPaintDevice
{
...
};
在QWidget之Alien与Native小记一文中,我们知道QWidget有alien和native之分,那么对这个结果也就不惊奇了。因为:
- 大部分QWidget默认都是alien的,而QWindow天生就是native的。
什么关系?
对于每一个native的QWidget的,其私有成员QWidgetPrivate中有一个:
d->extra->topextra->window = new QWidgetWindow(q);
其中,QWidgetWindow是QWindow的派生类。
这样一来,问题就解决了:
太乱了?
看了例子,
分享到:
相关推荐
Qt QWidget 互斥抽屉模型Qt QWidget 互斥抽屉模型 Qt5.0~Qt6..4均能编译通过
Qt 使用QWidget调用QML打开安卓摄像头可以实时预览,显示QT中使用QWidget调用QML的方法
通过重写QWidget实现在按钮上的进度条,点击按钮就会在按钮上绘制进度
1.这个是QT开发安卓 2.在QWidget 中通过按钮触发 3.QWidget与QML混合编程 4.使用ZXing库 5.支持开启闪光灯
自实现的一个翻转QWidget的demo;采用QPainter和QPropertyAnimation实现,是一个学习动画设计的高效demo
使用Qt Designer 设计界面,但在Qt Designer里设置好样式表,使用快捷键 shift + alt + r 进行预览,样式都是正常的,但程序运行起来,样式就不生效了。两种解决方法: 详情可以到文章里看一下。 ...
QT_QWidget实现去除原边框,自定义边框(最大化、最小化、关闭按钮)、可拆分窗口部件(由用户使用时自由拖动部件尺寸)、拖动窗体和缩放(窗体四周都可以拉伸缩放)、样式表美化部件窗口、解决QMouseEvent触发事件...
项目需要将一个外部软件嵌入自己编写的qt界面,类似于将外部程序当作自己软件的一个插件,以起到集成的目的。笔者这里用电脑自带的计算器为例。 传统做法: 1)首先打开需要的外部程序; 2)通过spy+获取的外部程序...
QT(Qwidget) + dicom QT(Qwidget) + dicom QT(Qwidget) + dicomQT(Qwidget) + dicom QT(Qwidget) + dicom QT(Qwidget) + dicom
尤其是QWidget类(我们也可以把它嵌入到一个QGraphicsView中)具有很多属性表示其bounds,colors等等。让我们看一个小例子:我们选择动画Qt属性的一个主要理由是Qt属性为我们提供了自己动画已存在的类的自由度。尤其...
获取到qml窗口句柄的方法,以及怎样将QWidget嵌入到获取到的qml窗口中
1. 使用github上C++二维码生成程序源码在Qt5.5.1(QWidget)上实现的二维码生成程序源码。 (github源码网址https://github.com/Hackaroth/QRCODE) 2. 二维码生成源码部分修改了一些使用Qt运行出现的问题及一些代码错误...
对应博文地址:http://blog.csdn.net/CSND_Ayo/article/details/70175385
Qt例程源代码QWidget.7z
QT将word嵌入到widget界面中
一个基于Qt 事件的屏幕键盘,可用
Qt5.8平台下QWidget读写ini文件 这是一个demo文件 这是一个demo文件
一个简单的qt程序设置QWidget大小
qt5 动态添加子widget
实现把QWidget嵌入到QML中,实现方案已经在博客中说明。