Qt是当今很流行的一种跨平台 GUI 框架,但是发展到如今,他的功能已经不局限于开发GUI应用程序 , 他也可以开发许多的非GUI程序和服务器程序等
Qt的入门比较简单,下面以常见的Hello World程序来开始Qt的学习
1 #include <QApplication> 2 #include<QLabel> 3 4 int main(int argc, char *argv[]) 5 { 6 QApplication a(argc, argv); 7 8 QLabel msg("Hello World"); 9 msg.show(); 10 11 return a.exec(); 12 }
<QApplication>是一个应用程序类所在的头文件 , 每个Qt程序都要包含该头文件,每次写程序的时候只要包含他就OK了
然后在main中实例化一个应用程序类的对象
QApplication a(argc,argv);
<QLabel>是 QLabel类所定义的都文件
QLabel 是一个窗口部件 (widget)。窗口部件相当于windows中的控件 和 容器。就是说,窗口部件既可以包含其他的窗口部件,又可以被其他的窗口部件包含。\
例如菜单,滚动条,状态栏 和 按钮等 都是窗口部件(widget),他们都继承自 QWidget 类。
绝大多数的应用程序 用 QMainWindow 或 QDialog 最为应用程序的主窗口 , 但是 Qt 和灵活, 任何一个 窗口部件 都可以作为主窗口使用,例如上面的HelloWorld
程序,就是用QLabel 最为程序的主窗口的。
上面的QLabel 实例化一个 对象 msg , 并让其text 属性为 “Hello World” :
QLabel msg("Hello World");
这样,一个窗口部件就创建出来了。但是,就像windows中的CreateWIndow一样,窗口只是在内存中创建好了,但是并没有被显示出来,要显示窗口的话,还需要调用
一个函数:void show();
msg.show();
如果学过windows下的GUI编程的话,就会知道这个函数就相当于 ShowWindow();
窗口显示以后,窗口程序就开始要运行了,窗口也就要开始处理各种事件了。这时候派上用场的就是 exec();
a.exec();
该函数相当于一个循环,在这个循环里,每次循环都检查窗口上有没有什么事件发生,例如 鼠标在窗口上点击啊,鼠标在窗口上划过啊 ,键盘被敲下啊 等等。
就类似于windows的消息循环,但此处是 事件循环。到此处,一个Hello World 程序就完成了
另外QLabel 还支持一些简单的HTML样式格式,例如
1 #include <QApplication> 2 #include<QLabel> 3 4 int main(int argc, char *argv[]) 5 { 6 QApplication a(argc, argv); 7 QLabel msg("<a href=\"http://www.baidu.com/\">Baidu</a>");//此处的就是让label上的文字以链接的形式现实出来 8 msg.show(); 9 10 return a.exec(); 11 }
就像上面的两个类那样,Qt中 , 所有的框架提供的类都以字母 Q 开头, 所有的类对应着一个 以其 类名 命名的 头文件。如果你想使用某一个类,只要包含
其相应的头文件即可。
下面继续来看Qt中的信号和槽机制。 信号和槽 机制 简单的来说就是 一个对象身上发生了某个事件 , 其通过某种手段 将发生的时间 通知另一个对象 , 然另一个
对象用某种手段来处理 发生的事件 。 用 信号 和 槽来命名很形象 , A 发生了某件事 , A 就发送一个 信息(就是信号) 给 B , B 有一个专门接受信息的 天线(就是槽)
B受到A发来的信息后 , 就开始做一些特定的事情 ( 有点远程控制的味道)。
信号和槽可以通过QObject::connect(A , signal<something happened > , B , slot<do something> )来关联
下面来看 信号-槽 的一个实例
1 #include <QApplication> 2 #include<QPushButton> 3 4 int main(int argc, char *argv[]) 5 { 6 QApplication a(argc, argv); 7 8 QPushButton msg("Hello World"); 9 msg.show(); 10 11 QObject::connect(&msg,SIGNAL(clicked()),&msg,SLOT(close())); 12 13 return a.exec(); 14 }
上面就是一个简单的 信号-槽 的使用 , 当PushButton 身上发生一个鼠标点击的事件时 , 就发送一个信号 clicked() 给他自身 , 他自身收到 clicked()信号后 , 就
执行一个动作 , 此处的动作就是close()关闭 , 可以发现 该程序 运行时,如果点击一下 PushButton , 程序就退出了
窗口部件的布局:
窗口部件的布局就是 处理widget 如何格式化摆放的问题的 。 下面先接触3个类
- QHBoxLayout
- 这个类用于将widget 按横向排列
- QVBoxLayout
- 这个类用于将widget按纵向排列
- QGridLayout
- 这个类用于将widget按网格状排列,一般在 将部件分组分别进行横竖排列后,再进行网格排列
下面是这三个类的使用实例
1 #include <QApplication> 2 #include<QPushButton> 3 #include<QSpinBox> 4 #include<QSlider> 5 #include<QHBoxLayout> 6 #include<QVBoxLayout> 7 #include<QGridLayout> 8 9 int main(int argc, char *argv[]) 10 { 11 QApplication a(argc, argv); 12 //创建各个窗口部件并初始化 13 QWidget* window = new QWidget; 14 QPushButton* btn1 = new QPushButton("b1"), 15 *btn2 = new QPushButton("b2"); 16 QSlider* slider = new QSlider; 17 QSpinBox* spinbox = new QSpinBox; 18 slider->setRange(0,200); 19 spinbox->setRange(0,200); 20 21 //创建窗口的布局 22 QHBoxLayout* hLayout = new QHBoxLayout; 23 QVBoxLayout* vLayout = new QVBoxLayout; 24 QGridLayout* gridLayout = new QGridLayout; 25 //btn1 和 slider 排成一排 26 hLayout->addWidget(btn1); 27 hLayout->addWidget(slider); 28 //btn2 和 spinbox 排成一列 29 vLayout->addWidget(btn2); 30 vLayout->addWidget(spinbox); 31 //将两组widget排列到网格中 32 gridLayout->addLayout(hLayout,0,0,1,2); 33 gridLayout->addLayout(vLayout,3,3,2,1); 34 //把布局应用到主窗口中 35 window->setLayout(gridLayout); 36 //设置 信号-槽 的关联 37 QObject::connect(slider,SIGNAL(valueChanged(int)), 38 spinbox,SLOT(setValue(int))); 39 QObject::connect(spinbox,SIGNAL(valueChanged(int)), 40 slider,SLOT(setValue(int))); 41 //显示窗口 42 window->show(); 43 44 return a.exec(); 45 }
该程序的运行结果如下