入门

来源:互联网 发布:淘宝现在卖什么赚钱 编辑:程序博客网 时间:2024/05/01 11:55

Qt有几个非常重要的概念,今天就初识下信号、槽和布局。

从经典的Hello World开始

#include <QtGui/QApplication>#include <qlabel.h>int main(int argc, char *argv[]){QApplication app(argc, argv);QLabel  *label = new  QLabel("Hello World");label->show();return app.exec();}

程序很简单,不过10行代码,从QApplication对象app的定义开始,直到app.exec()返回程序才结束。QApplication对象用于管理整个应用程序用到的资源,同时它也能处理命令行参数,QApplication对象的具体作用和原理会在以后的学习中一探究竟。细看以上代码,会发现一个问题,创建QLabel  对象之后没有删除,确实没有删除,也没有放进任何容器中,应为本段代码较小,因此直接忽略了QLabel对象的删除。

以上程序中,label是一个部件,同时也是该程序的窗口,任何一个部件都可以作为Qt程序的窗口。创建完QLabel对象之后调用它的show方法将之显示出来,一般部件创建好后都是隐藏的,这就允许我们对其先进行设置,避免闪烁现象。

最后app.exec()使得程序进入事件循环状态,等待用户的动作。将main函数做如下修改:

int main(int argc, char *argv[]){QApplication app(argc, argv);QLabel *label = new  QLabel("<h1>Hello World</h1>");QPushButton *btn = new QPushButton("Quit");QObject::connect(btn,SIGNAL(clicked()),&a,SLOT(quit()));btn->show();label->show();return a.exec();}

QLabel对象允许使用简单的HTML标签对其进行修饰,对比一开始的程序,本段函数多了一个QPushButton对象,QObject::connect这一行的作用是将一个clicked()信号发射出去,由app的quit()槽接受,当用户按下QPushButton对象时,该按钮就会发射一个clicked()信号,被app的quit槽收到,槽得到自动执行。

程序运行时将显示两个窗口,一个标签和一个按钮,点击按钮结束程序,这里由于label和btn都没有指定父窗口,所以他们都是顶层窗口。如果在QPushButton对象定义的时候将其父窗口指定为label,那么就只会显示一个窗口,btn部件显示在父窗口标签中,这时候btn->show();也可以省去。

接下来在对程序进行改造:

int main(int argc, char *argv[]){QApplication a(argc, argv);QWidget *window = new QWidget;window->setWindowTitle("Enter Your Age");QSpinBox *spinBox = new QSpinBox(window);QSlider *slider = new QSlider(Qt::Horizontal,window);spinBox->setRange(-130,130);slider->setRange(-130,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);QPushButton *btn = new QPushButton("Quit");QObject::connect(btn,SIGNAL(clicked()),&a,SLOT(quit()));QVBoxLayout *vlayout = new QVBoxLayout;vlayout->addLayout(layout);vlayout->addWidget(btn);window->setLayout(vlayout);window->show();return a.exec();}
这个程序使用一个QWidget对象作为主窗口,程序运行界面如下:


spinBox是左上的选择框,slider是旁边的横条,下方是一个按钮,改变spinBox的值,slider将会跟随变化,二滑动slider,spinBox的值也会跟着变化,这是怎么实现的呢,关键就是这两句:

1)QObject::connect(spinBox,SIGNAL(valueChanged(int)),slider,SLOT(setValue(int)));2)QObject::connect(slider,SIGNAL(valueChanged(int)),spinBox,SLOT(setValue(int)));
当我们改变spinBox值得时候,比如设置为35,spinBox就会发射valueChanged(int)信号,新值被作为参数传递,slider会收到这个信号,slider的槽setValue(int)会将slider的值设为35,slider的值发生了改变,由于2)的作用,slider会发射valueChanged(int)信号spinBox,, spinBox的setValue(int)槽处理该信号,将spinBox的值重新设为35,由于spinBox的旧值和新值一样,因此不会再发射valueChanged(int)信号。

Qt有三个主要的布局管理器,QHBoxLayout,QVBoxLayou以及QGridLayout,这里用到了前两个。spinBox和slider位于QHBoxLayout中,QHBoxLayout使得位于其中的部件从左到右排列(不一定是),然后将QHBoxLayout布局对象和一个按钮放置于QVBoxLayout中,QVBoxLayout使得其中的部件从上到下按照进入的顺序排列。因此就有了上图的界面布局。这里要注意的是spinBox,slider, layout和btn定义的时候没有指定父窗口,他们放到布局管理器中后就默认把布局管理器作为父窗口了。


0 0