存档
Qt学习笔记_Chapter1_3窗口部件的布局
Windows7下的程序运行效果图:
这一节主要讲了两点:(1)如何用布局(Layout)来管理窗口中窗口部件的几何形状;(2)如何利用信号和槽来同步窗口部件。
这个应用程序用了三个窗口部件:一个QSpinBox(微调框)、一个QSlider(滑块)和一个QWidget。其中QWidget是这个应用程序的主窗口,也是QSpinBox和QSlider的父对象,QWidget自己没有父对象。QWidget的构造函数以及它的所有子类都会带一个参数QWidget*,以用来说明谁是它们的父窗口部件。
- #include <QApplication>
- #include <QHBoxLayout>
- #include <QSlider>
- #include <QSpinBox>
- int main(int argc,char *argv[])
- {
- QApplication app(argc,argv);
- QWidget *windows=new QWidget;
- windows->setWindowTitle("Enter Your 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)));
- spinBox->setValue(35);
- QHBoxLayout *layout=new QHBoxLayout;
- layout->addWidget(spinBox);
- layout->addWidget(slider);
- windows->setLayout(layout);
- windows->show();
- return app.exec();
- }
Line8,9:创建了Widget对象,使用setWindowTitle()函数来设置显示在窗口标题栏上的文字。
Line10,11:创建了一个QSpinBox和一个QSlider,并分别在第12行和第13行设置了它们的有效范围。本应将这个窗口传递给QSpinBox和QSlider的构造函数,以说明这两个窗口部件的父对象都是这个窗口,但在这里没有这个必要,因为布局系统将会自行得出这一结果并自动把该窗口设置为微调框和滑块的父对象。
Line14-17:调用了两次QObject::connect(),来确保能够让微调框和滑块同步,一旦有一个窗口部件的值发生了改变那么就会发射它的valueChanged(int)信号,而另一个窗口部件就会用这个新值调用它的setValue(int)值。
Line18:将微调框的值设置为35,此时QSpinBox会发射valueChanged(int)信号,其中,int参数的值为35,触发QSlider的setValue(int)槽,避免无限循环的发生,流程如下图所示:
Line19-22:使用了一个布局管理器对微调框和滑块进行布局处理。布局管理器(layout manager)是一个能够对其所负责窗口部件的尺寸大小的位置进行设置的对象。Qt有三个主要的布局管理器类:(1)QHBoxLayout:在水平方向上排列窗口部件,从左到右;(2)QVBoxLayout:在竖起方向上排列窗口部件,由上到下;(3)QGridLayout,把各个窗口部件排列在一个网格中。第22行的QWidget::setLayout()函数调用会在窗口上安装该布局管理器。QSpinBox和QSlider会自动“重定义父对象”,成为这个安装了布局的窗口部件的子对象。因此当创建一个需要放进某个布局中的窗口部件时,就没有必要为其显式的指定父对象了。
Qt学习笔记_Chapter1_2建立连接
Windows7下程序运行效果图:
还记得MFC中,消息循环系统是每一个初学者都要费不少心思学习的东西,Qt中采用了一种完全不同的方式:信号和槽。还是从代码开始:
- #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();
- }
这里使用了QPushButton作为应用程序的主窗口部件。
Line7,8:Qt的窗口部件通过发射信号(signal)来表明一个用户动作已经发生了或者是一个状态已经改变了。例如,当用户单击QPushButton时,该按钮就会发射一个clicked()信号。信号可以与函数(在这里称为槽,slot)相连接,以便在发射信号时,槽可以得到自动执行。这里把按钮的clicked信号和QApplication对象的quit()槽连接起来。宏SIGNAL()和SLOT()是Qt语法中的一部分。
BTW:QObject这个类是QT对象模型的核心,绝大部分的QT类都是从这个类继承而来,这个模型的中心特征就是一个叫做信号和槽的机制来实现对象间的通讯。所有的widget都是QT object,因为它们继承自QWidget,而Qwidget正是继承自QObject
Qt学习笔记_Chapter1_1HelloQt
Windows7下程序运行效果图:
学习的每一步总是HelloWorld,Qt4.6直接推出了VS2008的Binary包,大大方便了我的学习,现在可以像写一般的MFC程序一样在VS集成环境中编写Qt程序了,Qt中的HelloWorld程序如下:
- #include <QApplication>
- #include <QLabel>
- int main(int argc,char *argv[])
- {
- QApplication app(argc,argv);
- QLabel *label=new QLabel("<h2><i>Hello</i> "
- "<font color=red>Qt!</font></h2>");
- label->show();
- return app.exec();
- }
Line1,2:对于每个Qt类,都有一个与该类同名(且大写)的头文件,在这个头文件中包括了对该类的定义。
Line5:创建了一个Qapplication对象,用来管理整个应用程序所用到的资源。Qt支持它自己的一些命令行参数,所以这里同样有argc,argv作为参数。
Line6:创建了一个QLabel Widget,这里的Widget相当于VC中的控件,Qt十分灵活,任意窗口部件(Widget)都可以作为窗口,这里就使用了一个Qlabel作为窗口。另外可以看到,通过使用一些简单的HTML样式格式,可以轻松地把Qt应用程序的用户接口变得更为丰富多彩。
Line8:使QLabel可见,默认隐藏是为了便于我们先进行设置然后再显示它们,从而避免了窗口部件的闪烁现象。
Line9:将应用程序的控制权传递给Qt。此时,程序会进入事件循环状态,这是一种等待模式,程序会等候用户的动作,例如鼠标单击和按键等操作。
BTW:在这个程序中没有过多关注在main()函数末尾处对QLabel对象的delete操作调用。在如此短小的程序内,这样一点内存泄漏(memory leak)问题无关大局,因为在程序结束时,这部分内存是可以由操作系统重新回收的。
近期评论