窗口部件
- 基础窗口部件QWidget
QWidget类是所有用户界面对象的基类,被称为基础窗口部件。
- 窗口与子部件:
#include<QtWidgets>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
//新建QWidget类对象,默认parent参数是0,所有它是个窗口
QWidget *widget = new QWidget();
//设置窗口标题
widget->setWindowTitle(QObject::tr("我是窗口"));
//新建QLabel对象,默认参数是0,所以它是个窗口
QLabel *label=new QLabel();
label->setWindowTitle(QObject::tr("我是label"));
//设置要显示的信息
label->setText(QObject::tr("label: 我是个窗口"));
//改变部件大小,以便能显示出完整的内容
label->resize(180,20);
//label2指定了父窗口为widget,所以不是窗口
QLabel *label2=new QLabel(widget);
label2->setText(QObject::tr("label2: 我不是独立窗口,只是widget的子部件"));
label2->resize(250,20);
//在屏幕上显示出来
label->show();
widget->show();
int ret=a.exec();
delete label;
delete widget;
return ret;
}
程序中定义了一个QWidget类对象的指针widget和两个Qlabel对象指针label和label2,其中label没有父窗口,而label2在widget中,widget是其父窗口。
注意:这里使用new操作符为label2分配了空间,但是并没有使用delete进行释放,这是因为在Qt中销毁父对象的时候会自动销毁子对象。
- 窗口类型
QWidget的构造函数有两个参数:QWidget * parent = 0和Qt::WindowFlags f = 0,前面的parent指父窗口部件,默认值为0,表明没有父窗口;而后面的f参数是Qt::WindowFlags类型的,是Qt::WindowType枚举类型的值或组合。 Qt::WindowType包括了很多类型,下面演示其中的Qt:Dialog和Qt::Splash-Screen,更改程序中新建对象的那两行代码:
QWidget *widget = new QWidget(0,Qt::Dialog);
QLabel *label=new QLabel(0,Qt::SplashScreen);
可以看到,更改窗口类型后窗口的样式发生了改变,一个是对话框类型,一个是欢迎窗口类型。 而窗口标志Qt::WindowFlags可以是多个窗口类型枚举值进行位或操作,下面再次更改那两行代码:
QWidget *widget = new QWidget(0,Qt::Dialog|Qt::FramelessWindowHint);
QLabel *label=new QLabel(0,Qt::SplashScreen|Qt::WindowStaysOnTopHint);
Qt::FramelessWindowHint用来产生一个没有边框的窗口,而Qt::WindowStaysOnTopHint用来使该窗口停留在所有其他窗口上面。
- 窗口几何布局
这里的函数分为两类:
包含框架: x(),y(),frameGeometry(),pos()和move()等函数;
不包含框架: geometry(),width(),height(),rect()和size()等函数。
使用qDebug()函数:
程序调试过程中常用的是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); // 输出x的值
int y = widget.y();
qDebug("y: %d", y);
QRect geometry = widget.geometry();
QRect frame = widget.frameGeometry();
qDebug() << "geometry: " << geometry << "frame: " << frame;
return a.exec();
}
这里使用了两种输出方法,一种是直接将字符串当作参数传给qDebug()函数,例如上面使用这种方法输出x和y的值。 另一种方法是使用输出流的方式一次输出多个值,它们的类型可以不同,如程序中输出geometry和frame的值。
在“return a.exec();”一行代码前添加如下代码:
qDebug() << "geometry: " << geometry << "frame: " << frame;
qDebug()<<"pos:"<<widget.pos()<<endl<<"rect:"<<widget.rect()
<<endl<<"size:"<<widget.size()<<endl<<"width:"
<<widget.width()<<endl<<"height:"