Qt5的安装很方便,在官网下载后直接安装即可,也不去使用VS,而是用自带的Qt Creater开发环境。
安装时只需要选择版本下的一个MinGW工具即可,而Qt Creater则会在Tool下自动勾选。
风格定制
使用黑色主题
使用真实制表符严格对齐
Qt默认的Tab是四个空格,改一下。
Ctrl+A
全选后Ctrl+I
可以自动对齐代码。
Qt的HelloWorld
它也和普通的C++程序一样从主函数开始执行,只是不要return 0
结束程序了,而是将控制权交给Qt来处理,进入事件循环。
#include <QApplication>//管理GUI程序的控制流和主要设置
#include <QLabel>//文本或图像的显示类
int main(int argc, char *argv[])
{
//对于任何一个使用Qt的图形用户界面应用程序,都正好存在一个QApplication对象
//传入主函数传进来的参数以构造这个QApplication对象
QApplication a(argc, argv);
//传入字符串以用文本去建立一个QLabel对象
QLabel label("大傻逼刘知昊,来学Qt");
//显示这个QLabel
label.show();
//把程序运行交给Qt处理,进入事件循环
return a.exec();
}
输出:
注意在Qt中不怎么使用类名* 对象指针=new 构造器(构造器参数);
的方式,因为后面当窗口开着时事件循环没有退出,exec()
方法还在继续,而无法预料的时候窗口关闭了,exec()方法将退出,这时没法很好的维护这种堆空间内存,而总是去让OS回收。
所以可以使用类名 对象(构造器参数);
的方式在栈空间里直接用。
connect方法和信号槽
信号槽是指事件发生时的对象会广播出一个信号,表示发生了该事件,而由其它对象可以考虑接受这个信号以做出响应。
connect(信号源对象A,发送的信号B,接收者对象C,调用函数D);
即A发出B信号后,C接收到后将调用D方法。其中接受者对象可以省略,即connect方法也被重载了多种具体的传参方式。
按下后退出的例子
#include <QApplication>
#include <QPushButton>//按钮类
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
//建立一个按钮,传入按钮上的文字
QPushButton qpb("退出按钮");
//按钮qpb的clicked事件发生(发出该信号)时,将调用默认的QApplication对象的quit方法退出
QObject::connect(&qpb,&QPushButton::clicked,&QApplication::quit);
//显示按钮
qpb.show();
return a.exec();
}
按下后在控制台输出的例子
还可以使用lambda表达式,原来C++也有这个:
#include <QApplication>
#include <QPushButton>//按钮类
#include <QDebug>//可以用来调试,和控制台交互
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
//建立一个按钮,传入按钮上的文字
QPushButton qpb("退出按钮");
//按钮qpb的clicked事件发生(发出该信号)时,将传true给这个lambda表达式的bool参数
QObject::connect(&qpb,&QPushButton::clicked,[](bool){
//相当于C++的cout,用来向控制台输出文本以调试
qDebug()<<"这个lambda表达式执行了,因为接收到了qpb的clicked事件";
});
//显示按钮
qpb.show();
return a.exec();
}
要在.pro
工程文件结尾添加:
QMAKE_CXXFLAGS += -std=c++0x
观察者模式
即M-V(模型-视图)模式,是由模型发生变化时去向所有使用该模型的视图发出通知。Qt中的信号槽就是一种观察者模式的实现。
观察者对象为了获得被观察者对象发出的”变化”信号,需要被放置在一个被观察者能够操作的容器中,让被观察者发生变化时,就会从容器中取得观察者向其发送”我发生变化了”这样的通知。
一个GUI的HelloWorld
创建Qt项目时把基类选择成QDialog能比较方便的快速构建一个带窗体的工程。
双击左侧生成的lzhdialog.ui
配置文件可以进入设计界面的模式。
看起来和VB很像,拖动就可以去设计这个界面了。拖进去一个Label,写点字,运行一下: