学习QT的阶段性总结
近期接触学习了QT,了解了QT的基本信息;之后着手编写了一些小程序,了解了一些相关的知识并总结了一些常犯的错误。
1、关于QT
- QT的简介
QT是一个跨平台的C++图形用户界面应用程序框架。它为程序开发者提供建立艺术级图形用户界面所需的所有功能。它是完全面向对象的,很容易扩展,并且允许真正的组件编程。
QT按照不同的版本发行,分为商业版和开源版。QT商业版为商业软件提供开发,它们提供传统商业软件发行版并且提供在协议有效期内的免费升级和技术支持服务。而QT开源版是为了开发自由而设计的开放源码软件,它提供了和商业版本同样的功能,在GNU通用公共许可证下,它是免费的。 - QT的下载与安装
下载地址:
下载好需要的版本之后点击进行安装,注意在选择组件的时候要选全自己需要的组件,不然后期构建运行时会运行不了,并报出下图错误: 3.项目的创建
(1)创建项目时勾选界面创建,创建 文件中会有界面文件,可以进行拖拽控件进行布局。这个时候对控件的点击信号与对应槽函数连接,需要右击,选择转到槽,选择对应的函数,跳转进去之后就可以进行编程了。
(2)运用代码进行界面设计(个人比较推荐运用代码进行页面设计)。先进行控件定义,后进行信号与槽函数连接。
2、一些相关知识
信号与槽机制
QT提供了信号和槽机制用于完成界面操作响应,是完成任意两个QT对象之间的通信机制。其中,信号会在某个特定情况或动作下被触发,槽等同于接收并处理信号的函数。
信号与槽机制的连接方式
(1)一个信号可以与另一个信号相连connect (Object1,SIGNAL(signal1),Object2,SIGNAL(signal1));(2)同一个信号可以和多个槽相连connect (Object1,SIGNAL(signal2),Object2,SIGNAL(slot2));connect (Object1,SIGNAL(signal2),Object3,SIGNAL(slot1));(3)同一个槽可以相应多个信号connect (Object1,SIGNAL(signal2),Object2,SIGNAL(slot2));connect (Object3,SIGNAL(signal2),Object3,SIGNAL(slot2));(4)常用的连接方式为:connect (Object1,SIGNAL(signal1),Object2,SIGNAL(slot));
元对象系统
(1)基类QObject:任何需要使用元对象系统功能的类必须继承QObject。
(2)Q_OBJECT宏:Q_OBJECT宏必须出现在类的私有声明区,用于启动元对象的特性。(只要有信号与槽函数的时间连接,则必须声明)
(3)元对象编译器(Meta-Object Complier,moc):为QObject自雷实现元对象特性提供必要的代码实现。
3、一些错误总结及注意点
1.程序异常结束
我所遇到的程序异常结束的情况有两种:
(1)定义的对象没有实例化:如果没有实例化(就是我们说的new一下),那么所定义的PushButton指针,LineEdit指针就是空指针,在程序执行时获取不到指针内容,那么程序无法继续执行,当然就会异常结束了。
emailLabel = new QLabel("电子邮件:");emailLineEdit = new QLineEdit();addressLabel = new QLabel("联系地址:");addressLineEdit = new QLineEdit();EMScodeLabel = new QLabel("邮政编码:");EMScodeLineEdit = new QLineEdit();mobPhoneLabel = new QLabel("移动电话:");mobPhoneLineEdit = new QLineEdit();
(2)逻辑问题:在进行登陆注册界面设计的时候,如果没有注册直接登陆,程序就会异常结束。这是因为登录时要和已经注册的内容进行比较,如果没有注册,那么获取注册信息时就获取不到(即指针为空)。
这种情况下设置判断条件进行错误提示或者设置初始值都是可以的。我采用的是设置一个flag参数进行判断:
compare = registerMenu->getFlag();
if(flag==compare)
{QMessageBox::question(this,tr("Question"),tr("该用户不存在,是否注册?"),QMessageBox::Yes|QMessageBox::No,QMessageBox::Yes);registerMenu = new Register(this);registerMenu->show();
}
2、注意头文件的添加
在程序编写过程中我们会调用一些需要的函数,比如 QGridLayout, QMessageBox等,如果我们调用的时候没有加头文件,可想而知,程序执行时会认为我们所用的是未定义的。所以我们要注意添加好头文件,避免不必要的报错。
学习QT的阶段性总结
近期接触学习了QT,了解了QT的基本信息;之后着手编写了一些小程序,了解了一些相关的知识并总结了一些常犯的错误。
1、关于QT
- QT的简介
QT是一个跨平台的C++图形用户界面应用程序框架。它为程序开发者提供建立艺术级图形用户界面所需的所有功能。它是完全面向对象的,很容易扩展,并且允许真正的组件编程。
QT按照不同的版本发行,分为商业版和开源版。QT商业版为商业软件提供开发,它们提供传统商业软件发行版并且提供在协议有效期内的免费升级和技术支持服务。而QT开源版是为了开发自由而设计的开放源码软件,它提供了和商业版本同样的功能,在GNU通用公共许可证下,它是免费的。 - QT的下载与安装
下载地址:
下载好需要的版本之后点击进行安装,注意在选择组件的时候要选全自己需要的组件,不然后期构建运行时会运行不了,并报出下图错误: 3.项目的创建
(1)创建项目时勾选界面创建,创建 文件中会有界面文件,可以进行拖拽控件进行布局。这个时候对控件的点击信号与对应槽函数连接,需要右击,选择转到槽,选择对应的函数,跳转进去之后就可以进行编程了。
(2)运用代码进行界面设计(个人比较推荐运用代码进行页面设计)。先进行控件定义,后进行信号与槽函数连接。
2、一些相关知识
信号与槽机制
QT提供了信号和槽机制用于完成界面操作响应,是完成任意两个QT对象之间的通信机制。其中,信号会在某个特定情况或动作下被触发,槽等同于接收并处理信号的函数。
信号与槽机制的连接方式
(1)一个信号可以与另一个信号相连connect (Object1,SIGNAL(signal1),Object2,SIGNAL(signal1));(2)同一个信号可以和多个槽相连connect (Object1,SIGNAL(signal2),Object2,SIGNAL(slot2));connect (Object1,SIGNAL(signal2),Object3,SIGNAL(slot1));(3)同一个槽可以相应多个信号connect (Object1,SIGNAL(signal2),Object2,SIGNAL(slot2));connect (Object3,SIGNAL(signal2),Object3,SIGNAL(slot2));(4)常用的连接方式为:connect (Object1,SIGNAL(signal1),Object2,SIGNAL(slot));
元对象系统
(1)基类QObject:任何需要使用元对象系统功能的类必须继承QObject。
(2)Q_OBJECT宏:Q_OBJECT宏必须出现在类的私有声明区,用于启动元对象的特性。(只要有信号与槽函数的时间连接,则必须声明)
(3)元对象编译器(Meta-Object Complier,moc):为QObject自雷实现元对象特性提供必要的代码实现。
3、一些错误总结及注意点
1.程序异常结束
我所遇到的程序异常结束的情况有两种:
(1)定义的对象没有实例化:如果没有实例化(就是我们说的new一下),那么所定义的PushButton指针,LineEdit指针就是空指针,在程序执行时获取不到指针内容,那么程序无法继续执行,当然就会异常结束了。
emailLabel = new QLabel("电子邮件:");emailLineEdit = new QLineEdit();addressLabel = new QLabel("联系地址:");addressLineEdit = new QLineEdit();EMScodeLabel = new QLabel("邮政编码:");EMScodeLineEdit = new QLineEdit();mobPhoneLabel = new QLabel("移动电话:");mobPhoneLineEdit = new QLineEdit();
(2)逻辑问题:在进行登陆注册界面设计的时候,如果没有注册直接登陆,程序就会异常结束。这是因为登录时要和已经注册的内容进行比较,如果没有注册,那么获取注册信息时就获取不到(即指针为空)。
这种情况下设置判断条件进行错误提示或者设置初始值都是可以的。我采用的是设置一个flag参数进行判断:
compare = registerMenu->getFlag();
if(flag==compare)
{QMessageBox::question(this,tr("Question"),tr("该用户不存在,是否注册?"),QMessageBox::Yes|QMessageBox::No,QMessageBox::Yes);registerMenu = new Register(this);registerMenu->show();
}
2、注意头文件的添加
在程序编写过程中我们会调用一些需要的函数,比如 QGridLayout, QMessageBox等,如果我们调用的时候没有加头文件,可想而知,程序执行时会认为我们所用的是未定义的。所以我们要注意添加好头文件,避免不必要的报错。