Qt(一) Qt入门

来源:互联网 发布:沈阳三好街java培训 编辑:程序博客网 时间:2024/05/18 22:40

    • 1 Hello Qt
    • 2 建立连接
    • 3 窗口部件的布局
    • 4 使用参考文档

1.1 Hello Qt

依旧从一个简单的Qt程序开始入门。

#include<QApplication>#include<QLabel>int main(int argc, char * argv[]) {    QApplication app(argc, argv);    QLabel *label = new QLabel("hello");    label->show();    return app.exec();    delete label;}

第1行和第2行,包含了类QApplication和QLabel的定义。对于每个Qt类,都有一个与该类同名且大写的头文件,在这个头文件中对该类进行定义。
第5行,创建了一个QApplication对象,用来管理整个应用程序所用到的资源(??)。这个QApplication 构造函数需要两个参数,分别是 argc 和 argv ,因为Qt支持它自己的一些命令行参数。
第6行,创建了一个显示“hello” 的QLabel窗口部件(widget)。在Qt 和 UNIX的术语中,窗口部件就是用户界面中的一个可视化元素。按钮、菜单、滚动条和框架都是窗口部件。窗口部件也可以包含其他窗口部件,例如,应用程序的窗口通常就是一个包含了一些 QMenuBar、一些 QToolBar、一些 QStatusBar等窗口部件的窗口部件。绝大多数应用程序都会使用一个 QMainWindow 或者一个 QDialog 来作为它的窗口,但是 Qt是如此灵活,以至于任意窗口部件都可以用作窗口。在本例中,就是用窗口部件 QLabel 作为应用程序的窗口的。
第7行,是QLabel标签可见。在创建窗口部件的时候,标签通常都是隐藏的,这就允许我们先对其进行设置然后再显示它们,从而避免了窗口部件的闪烁现象。
第8行,将应用程序的控制权传递给Qt。此时,程序会进入事件循环状态,这是一种等待模式,程序会等候用户的动作,例如鼠标单击和按键等操作。用户的动作会让可以产生响应的程序生成一些事件(event,也称为 “消息”),这里的响应通常就是执行一个或者多个函数。
第10行,是回收指针类型的变量 label。
在命令提示符下,进入hello目录,输入如下命令,生成一个与平台无关的项目文件hello.pro:

qmake -project

然后,输入如下命令,从这个项目文件生成一个与平台相关的 makefile 文件:

qmake hello.pro

键入 make 命令就可以构建该程序。要运行程序,在Window下可以输入 hello,在UNIX下可以输入./hello。要结束该程序,可以直接单击窗口标题栏上的关闭按钮。

1.2 建立连接

第二个例子要说明的是如何响应用户的动作。这个应用程序由一个按钮构成,用户可以点击这个按钮退出程序。与第一个例子很类似,同时,我们还会将用户的一个动作(单击按钮)和一段代码连接起来。

#include<QApplication>#include<QPushButton>int main(int argc, char * argv[]) {    QApplication app(argc, argv);    QPushButton *button = new QPushButton("Quit!");    QObject::connect(button, SIGNAL(clicked()), &app, SLOT(quit()));    button->show();    return app.exec();    delete button;}

Qt 的窗口部件通过发射信号(signal)来表明一个用户动作已经发生了或者是一个状态已经改变了。例如,当用户单击 QPushButton 时,该按钮就会发射一个clicked() 信号。信号可以与函数(在这里称为槽,slot)相连接,以便在发射信号时,槽可以得到自动执行。在这个例子中,我们把这个按钮的 clicked() 信号与 QApplication 对象的 quit() 槽连接起来。宏 SIGNAL() 和 SLOT() 是Qt语法中的一部分。

1.3 窗口部件的布局

这节创建一个简单的例子程序,以说明如何用布局(layout)来管理窗口中窗口部件的几何形状,还要说明如何利用信号和槽来同步窗口部件。运行效果如下所示,它可以用来询问用户的年龄,而用户可以通过操作微调框(spin box) 或者 滑块 (slider) 来完成年龄的输入。

这里写图片描述

这个应用程序由三个窗口部件组成:一个 QSpinBox,一个 QSlider 和一个 QWidget。QWidget 是这个程序的主窗口。QSpinBox 和 QSlider会显示在 QWidget 中,它们都是 QWidget 窗口部件的子对象。换言之, QWidget 窗口部件是其他两个窗口部件的父对象。 QWidget 窗口部件自己则没有父对象,因为程序把它当做顶层窗口。 QWidget 的构造函数以及它的所有子类都会带一个参数 QWidget *,以用来说明谁是它们的父窗口部件(??)。

#include<QApplication>#include<QHBoxLayout>#include<QSlider>#include<QSpinBox>int main(int argc, char *argv[]){    QApplication app(argc, argv);    QWidget *window = new QWidget;    window->setWindowTitle("Enter age");    QSpinBox *spinBox = new QSpinBox;    QSlider *slider = new QSlider(Qt::Horizontal);    spinBox->setRange(0, 130);    slider->setRange(0, 130);    QObject::connect(spinBox, SIGNAL(valueChanged(int)),                         slider, SLOT(setValue(int)));    QObject::connect(slider, SIGNAL(valueChanged(int)),                         spinBox, SLOT(setValue(int)));    slider->setValue(35);    QHBoxLayout *layout = new QHBoxLayout;    layout->addWidget(spinBox);    layout->addWidget(slider);    window->setLayout(layout);    window->show();    return app.exec();}

第8,9行,创建了 QWidget 对象,并把它作为应用程序的主窗口。
第10,11行,分别创建了一个 QSlider 和一个 QSpinBox,并分别设置了它们的有效范围。这里本应该把窗口 QWidget 传递给QSpinBox和 QSlider 的构造函数,以说明这两个窗口部件的父对象都是 QWidget 窗口,但在这里没有这个必要,因为布局系统将会自行得出这一结果并自动把该窗口设置为微调框和滑块的父对象,下面将很快能看到这一点。
第14-17行,调用了两次 QObject::connect() ,这是为了确保能够让微调框和滑块同步,以便它们两个总是可以显示相同的数值。一旦有一个窗口部件的值发生改变,那么就会发射它的 valueChanged(int) 信号,而另一个窗口部件就会用这个新值调用它的setValue(int)槽。
第18行,将微调框的值设置为35.当发生这种情况时,QSpinBox 就会发射 valueChanged(int) 信号,其中, int 参数的值是35.这个参数会被传递给 QSlider 的setValue(int) 槽,它会把这个滑块的值设置为 35 。于是,滑块就会发射 valueChanged(int) 信号,因为它的值发生了变化,这样就触发了微调框的 setValue(int) 槽。但在这一点上,setValue(int) 不会再发射任何信号,因为微调框的值已经是 35 了。这样就避免了无限循环。
第19-22行,使用了一个布局管理器对微调框和滑块进行布局处理。布局管理器(layout manager)就是一个能够对其所负责窗口部件的尺寸大小和位置进行设置的对象。Qt 有三个主要的布局管理器类:

  • QHBoxLayout ,在水平方向上排列窗口部件,从左到右;
  • QVBoxLayout ,在竖直方向上排列窗口部件,从上到下;
  • QGridLayout ,把各个窗口部件排列在一个网格中。

第22行,QWidget::setLayout() 函数调用会在窗口上安装该布局管理器(见下图)。从软件的底层实现上来说,QSpinBox 和 QSlider 会自动“重定义父对象”,它们会成为这个安装了布局的窗口部件的子对象。也正是基于这种原因,当创建一个需要放进某个布局中的窗口部件时,就没有必要为其显式的指定父对象了。
这里写图片描述
尽管没有明确的设置任何一个窗口部件的位置或大小,但是 QSpinBox 和 QSlider 还是能够非常好看的一个挨着一个显示出来。这是因为 QHBoxLayout 可根据所负责的子对象的需要为他们分配所需的位置和大小。布局管理器使我们从应用程序的各种屏幕位置关系的复杂中解脱出来,并且它还可以确保窗口尺寸大小发生改变时的平稳性。
Qt 中构建用户接口的方法很容易理解并且非常灵活。 Qt 程序猿最长使用的方式是先声明所需的窗口部件,然后在设置它们所应具有的属性。程序猿把这些窗口部件添加到布局中,布局会自动设置它们的位置和大小。利用 Qt 的信号和槽机制,并通过窗口部件之间的连接就可以管理用户的交互行为。

1.4 使用参考文档

在WIndows下,可以运行 Qt Assistant。
需要注意的是,通过继承而得到的函数的文档会显示在它的基类中,例如, QPushButton 就没有它自己的 show() 函数,因为它是从 QWidget 那里继承的函数。下图给出了目前为止我们所用到的各个类之间的关系:
这里写图片描述


注:未经作者允许,禁止转载!!

1 0
原创粉丝点击