QT教程4-使用窗口部件
文件:
这个例子显示了如何创建一个你自己的窗口部件,描述了如何控制一个窗口部件的最小大小和最大大小。
#include <QApplication>
#include <QFont>
#include <QPushButton>
#include <QWidget>
class MyWidget : public QWidget
{
public:
MyWidget(QWidget *parent = 0);
};
MyWidget::MyWidget(QWidget *parent)
: QWidget(parent)
{
setFixedSize(200, 120);
QPushButton *quit = new QPushButton(tr("Quit"), this);
quit->setGeometry(62, 40, 75, 30);
quit->setFont(QFont("Times", 18, QFont::Bold));
connect(quit, SIGNAL(clicked()), qApp, SLOT(quit()));
}
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
MyWidget widget;
widget.show();
return app.exec();
}
一行一行地品读
class MyWidget : public QWidget
{
public:
MyWidget(QWidget *parent = 0);
};
这里我们创建了一个新类。因为这个类继承了QWidget,所以新类是一个窗口部件,并且可以为一个顶层窗口或者子窗口部件(像第前一章的QPushButton)。
这个类只有一个成员:一个构造函数(加上从QWidget继承来的成员函数)。这个构造函数是一个标准的Qt窗口部件构造函数,当你创建窗口部件的时候你应该总是包含一个相似的构造函数。
这个参数是它的父窗口部件。为了生成一个顶层窗口,你需要指定一个空指针作为父窗口部件。就像你看到的那样,这个窗口部件默认地被认做是一个顶层窗口。
MyWidget::MyWidget(QWidget *parent)
构造函数的实现从这里开始。同大多数窗口部件一样,它把parent传递给了QWidget构造函数。
: QWidget(parent)
{
setFixedSize(200, 120);
因为这个窗口部件不知道如何处理重新定义大小,我们固定它的值。在下一章,我们将演示一个窗口部件如何响应用户的重新定义大小事件。
QPushButton *quit = new QPushButton(tr("Quit"), this);
quit->setGeometry(62, 40, 75, 30);
quit->setFont(QFont("Times", 18, QFont::Bold));
这里我们创建并设置了这个窗口部件的一个子窗口部件(新窗口部件的父窗口部件是this,例如MyWidget)。
函数tr()逐字调用字符串“Quit”来标记字符串的译文,使得其能够根据实际需要来改为翻译后的内容。在用户能够看到的字符串的地方使用tr()是一个好习惯,例如你决定以后将你的应用程序翻译成其他语言的。
注意quit是这个构造函数的一个局部变量。MyWidget不能跟踪它,但是Qt可以,并且在MyWidget被删除的时候自动删除它。这就是为什么MyWidget不需要一个析构函数的原因。(另一方面,删除一个子窗口部件也没有什么坏处,如果你选择的话。这个子窗口部件会自动告诉Qt它的即将死亡。)
QWidget::setGeometry()同时调用窗口部件的屏幕方位和大小的集合。它和在QWidget::resize()之后调用QWidget::move()是同等的。
connect(quit, SIGNAL(clicked()), qApp, SLOT(quit()));
}
指针qApp是一个在头文件<QApplication>中声明的全局变量。它指向应用程序的唯一QApplication实例。
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
MyWidget widget;
widget.show();
return app.exec();
}
这里我们举例说明了我们的新子窗口部件,演示并执行这个应用程序。
运行这个程序
这个程序在行为上和第一章非常相似。不同在于我们实现的方式。但它的行为还是有些细微的差别。试着改变它的大小看一看。
练习
试着在main()中创建另一个MyWidget对象。发生了什么?
试着添加更多的按钮或者把除了QPushButton.之外的东西放到窗口部件中。