Qt教程3-家族数值
文件:
这个例子演示了如何创建一个父窗口部件和子窗口部件。
我们将会保持这个程序的简单性,并且只使用一个单一的父窗口部件和一个独立的子窗口部件。
#include <QApplication>
#include <QFont>
#include <QPushButton>
#include <QWidget>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QWidget window;
window.resize(200, 120);
QPushButton quit("Quit", &window);
quit.setFont(QFont("Times", 18, QFont::Bold));
quit.setGeometry(10, 40, 180, 40);
QObject::connect(&quit, SIGNAL(clicked()), &app, SLOT(quit()));
window.show();
return app.exec();
}
一行一行地品读
# include <QWidget>
我们添加一个包含<QWidget>来获得我们所要使用的基本窗口部件类。
QWidget window;
这里我们简单地创建了一个简易的窗口部件对象。QWidget类是所有用户界面对象的基类。窗口部件则是用户界面的原子:它接收来自鼠标、键盘以及其他视窗系统的事件,并将其表示在屏幕上。一个窗口部件被它的父窗口部件和它前面的窗口部件所截断(clipped)。
一个没有嵌入到父窗口部件的窗口部件,就像这个单独的窗口部件,被成为一个窗口。通常,窗口有它们自己的边框和任务栏,由视窗系统提供。一个没有父窗口部件的窗口部件经常是一个独立的窗口。它在屏幕中的起始位置有视窗系统控制。
window.resize(200, 120);
我们设置这个窗口的宽度为200像素,高度为120像素。
QPushButton quit("Quit", &window);
一个子窗口部件产生了。这个QPushButton由一个父窗口部件(窗口)创建。一个子窗口部件总是显示于它的父窗口部件的区域内。当它被显示的时候,它被父窗口部件的边界挡住了一部分。它被默认的固定于其父窗口部件的左上角,位于(0,0)坐标处。
quit.setGeometry(10, 40, 180, 40);
函数QWidget::setGeometry()取四个参数:前两个为按钮左上角坐标对应的x和y,此坐标相对于父窗口部件;后两个参数为按钮的宽和高。结果是一个从坐标(10,40)延伸至(190,80)的一个按钮。
window.show();
当父窗口部件被显示的时候,它会调用所有子窗口部件的显示函数(除非在这些子窗口部件中你已经明确地使用QWidget::hide()来隐藏)。
留心事件的顺序
学习了QObject的读者,可以回想到当一个QObject的析构函数被调用时,如果这个QObject还有“子”,它的析构函数将自动调用每个“子”的析构。因此可能出现QPushButton退出的析构函数在主函数末尾被调用两次,一次是当它的父窗口部件——窗口,被析构后析构函数删除“退出”按钮因为它是一个“子”第二次是当“退出”按钮本身退出时。但是没有必要担心这种情况,这个代码是正确的。然而,有一种情况我们必须留意栈中的对象被析构的顺序。关于解释,请参看这篇note on the order of construction/destruction of QObjects(《注意Qobject创建/析构的顺序》)。
运行该程序
按钮不再充满整个窗口。取而代之的是,它停留在坐标(10,40)处并且内部大小为(180,40),因为QWidget::setGeometry()的调用。
练习
试着改变窗口的大小。如何改变按钮的大小呢?当你用稍大一点的字体来运行这个程序,按钮的宽度发生了什么变化?如果你试着让窗口足够小又会发生什么呢?