- QWidget类是所有用户界面对象的基类,被称为基础窗口部件。
- QWidget继承子QObject类和QPaintDevc类。
- QObject类:所有支持Qt对象模型的对象的基类。
- QPaintDevc类:所有可以绘制的对象基类。
1. 窗口部件与子部件
- 新建空的qmake项目,名称为mywidget1,添加main.cpp并编辑代码:
#include <QtWidgets>
int main(int argc,char * argv[])
{
QApplication a(argc,argv);
QWidget * widget=new QWidget(0,Qt::Dialog|Qt::FramelessWindowHint);
widget->setWindowTitle(QObject::tr("我是widget"));
QLabel * label=new QLabel(0,Qt::SplashScreen|Qt::WindowStaysOnTopHint);
label->setWindowTitle(QObject::tr("我是label"));
label->setText(QObject::tr("label:我是窗口"));
label->resize(260,20);
QLabel * label2=new QLabel(widget);
label2->setText(QObject::tr("label2:我不是独立的窗口,只是widget的子部件"));
label2->resize(260,20);
label->show();
widget->show();
int ret=a.exec();
delete label;
delete widget;
return ret;
}
- Widget就是窗口部件,它是Qt中建立用户界面的主要元素。像主窗口、对话框、标签、按钮、文本输入框等都是窗口部件。
- Qt中把没有嵌入到其他部件中的部件称为窗口,一般窗口都有边框和标题栏。窗口就是没有父部件的部件,所以又称为顶级部件。与之相对的是非窗口部件,又称为子部件。
2. 窗口类型
- QWidget(QWidget *parent = Q_NULLPTR, Qt::WindowFlags f = Qt::WindowFlags())
- QWidget的构造函数有两个参数,前面1个是父窗口部件,默认值是0,表明没有父窗口;后面的参数是指窗口类型。
- Qt::WindowType枚举类型用来为部件指定各种窗口系统属性,比如 f=0 表明窗口类型为Qt::Widget,这是QWidget的默认类型。
- Qt::WindowType还包括很多类型,如Qt::Dialog和Qt::SplashScreen
QWidget * widget=new QWidget(0,Qt::Dialog);
QWidget * widget=new QWidget(0,Qt::Dialog);
QWidget * widget=new QWidget(0,Qt::Dialog|Qt::FramelessWindowHint);
QLabel * label=new QLabel(0,Qt::SplashScreen|Qt::WindowStaysOnTopHint);
- QWidget中还有一个 setWindowState() 函数可以直接设置窗口的状态。包括:
- 最大化 Qt::WindowMaximized
- 最小化 Qt::WindowMinimized
- 全屏显示 Qt::WindowFullScreen
- 活动窗口 Qt::WindowActive
- 默认值为正常状态 Qt::WindowNoState
3. 窗口几何布局
- 对于一个窗口,往往要设置它的大小和运行时出现的位置,这就是窗口几何布局。
- 前面的例子中widget默认的大小就是它所包含的子部件label2的大小,而widget和label出现在窗口上的位置也是不确定的。
- 对于窗口的大小和位置,根据是否包含边框和标题栏两种情况,要用不同的函数来获取。
- 在帮助中搜索Window and Dialog Widgets:
- 包含框架:x(), y(), frameGeometry(), pos(), move()
- 不包含框架:geometry(), width(), height(), rect(), resize()
4. qDebug调试程序
#include <QApplication>
#include <QWidget>
#include <QDebug>
int main(int argc,char * argv[])
{
QApplication a(argc,argv);
QWidget widget;
widget.resize(400,300);
widget.move(200,100);
widget.show();
int x=widget.x();
qDebug("X: %d",x);
int y=widget.y();
qDebug("Y: %d",y);
QRect geometry=widget.geometry();
QRect frame=widget.frameGeometry();
qDebug()<<"geometry"<<geometry<<"frame"<<frame<<endl;
return a.exec();
}