QWidget类是所有用户界面对象的基类,被称为基础窗口部件。QWidget继承自QObject类和QPaintDevice类。

QObject类是所有支持Qt对象模型(Qt Object Model)的Qt对象的的基类。

QPaintDevice类是所有可以绘制的对象的基类。

简单代码:

#include "mainwindow.h"
#include <QApplication>
#include <QLabel>
#include <QWidget>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
// w.show();
//新建一个窗口 没有父对象
QWidget *widgetParent = new QWidget();
widgetParent->setWindowTitle(QObject::tr("我是widget窗口"));
// labelChild指定了父窗口为widget,所以不是窗口
QLabel *labelChild = new QLabel(widgetParent);
labelChild->setText(QObject::tr("labelChild:我不是独立窗口,\n只是widget的子部件"));

// 新建QLabel对象,没有父对象
QLabel *label2Parent = new QLabel();
labelParent->setWindowTitle(QObject::tr("我是labelParent窗口"));
//设置窗口的大小
labelParent->resize(300,300);
// 设置要显示的信息
labelParent->setText(QObject::tr("labelParent:我是个窗口"));


// 在屏幕上显示出来
labelParent->show();
widgetParent->resize(300,300);
widgetParent->show();


int ret = a.exec();
delete widgetParent;//会自动删除labelChild;
delete labelParent;
return ret;
}

运行结果:

14 窗口、子窗口、窗口几何尺寸_单选框

窗口部件(Widget):简称部件,是搭建Qt界面的主要组成部分。窗口部件不但包含我们前面讲过的QMainWindow、QDialog、QWidget还包括我们常用的按钮、标签、表格、单选框等都是窗口部件。

窗口:我们把没有嵌入到其他部件中的部件称为窗口,窗口一般都有标题栏和边框。 窗口就是没有父部件的部件,所以称为顶层部件。

子部件:又称非窗口部件,在Qt中大部分部件被用作子部件,它们嵌入在别的窗口中,例如我们常说的按钮、标签、单选框等。

窗口类型

QWidget构造函数:QWidget::QWidget(QWidget * parent = 0, Qt::WindowFlags f = 0) 

(1)前面的parent就是指父窗口部件,默认值为0,表明没有父窗口;

(2)f参数是Qt::WindowFlags枚举类型的,分为窗口类型(WindowType)和窗口标志(WindowFlags)。

(3)前者可以定义窗口的类型,比如我们这里f=0,表明使用了Qt::Widget一项,这是QWidget的默认类型,这种类型的部件如果有父窗口,那么它就是子部件,否则就是独立的窗口。

(4)后者包括了很多类型,

常用标志举例

Qt::FramelessWindowHint用来产生一个没有边框的窗口。

Qt::WindowStaysOnTopHint用来使该窗口停留在所有其它窗口上面。

Qt::Dialog用来生成对话窗口(就是带问号的窗口)

Qt::SplashScreen用来产生一个没有边框的窗口。

窗口的几何尺寸

对于一个窗口,往往要设置它的大小和运行时出现的位置,这就是窗口几何布局。在前面的例子中已经看到了, widgetParent默认的大小就是它所包含的子部件 labe2Child的大小,即使widgetParent设置了大小,还是以labe2Child为准。

而widgetParent和labe2Child出现时在窗口上的位置也是不确定的。对于窗口的大小和位置,根据是否包含边框和标题栏两种情况,要用不同的函数来获取。可以在帮助索引中查看Window and Dialog Widgets关键字,文档中显示了窗口的几何布局图,

14 窗口、子窗口、窗口几何尺寸_父窗口_02

这里的函数分为两类,一类是包含框架的,一类是不包含框架的:

包含框架:x()、y()、frameGeometry()、pos()和move()等函数;

不包含框架:geometry()、width()、height()、rect()和size()等函数。

可以添加以下代码得到:

qDebug()<<"widgetParent->x();"<<widgetParent->x();
qDebug()<<"widgetParent->y();"<<widgetParent->y();
qDebug()<<"widgetParent->pos();"<<widgetParent->pos();
qDebug()<<"widgetParent->frameGeometry();"<<widgetParent->frameGeometry();
qDebug()<<"widgetParent->geometry();"<<widgetParent->geometry();
qDebug()<<"widgetParent->width();"<<widgetParent->width();
qDebug()<<"widgetParent->height();"<<widgetParent->height();
qDebug()<<"widgetParent->size();"<<widgetParent->size();
qDebug()<<"widgetParent->rect();"<<widgetParent->rect();