首页 > 代码库 > QT杂记(网上资料整理而成)
QT杂记(网上资料整理而成)
1.新建工程时,Qwidget和Qdialog和Qmianwindow三者的区别?
QWidget是所有图形界面的基类
QMainWindow是一个提供了菜单、工具条的程序主窗口
QDialog是对话框、多用于短时间与用户的交互
QMainWindow和QDialog都是QWidget的子类。
QWidget类是所有用户界面对象的基类。 窗口部件是用户界面的一个基本单元:它从窗口系统接收鼠标、键盘和其它事件,并且在屏幕上绘制自己。每一个窗口部件都是矩形的,并且它们按Z轴顺序排列。一个窗口部件可以被它的父窗口部件或者它前面的窗口部件盖住一部分。
QMainWindow 类提供一个有菜单条、锚接窗口(例如工具条)和一个状态条的主应用程序窗口。主窗口通常用在提供一个大的中央窗口部件(例如文本编辑或者绘制画布)以及周围 菜单、工具条和一个状态条。QMainWindow常常被继承,因为这使得封装中央部件、菜单和工具条以及窗口状态条变得更容易,当用户点击菜单项或者工具条按钮时,槽会被调用。
QDialog类是对话框窗口的基类。对话框窗口是主要用于短期任务以及和用户进行简要通讯的顶级窗口。QDialog可以是模态对话框也可以是非模态对话框。QDialog支持扩展性并且可以提供返回值。它们可以有默认按钮。QDialog也可以有一个QSizeGrip在它的右下角,使用setSizeGripEnabled()。
QDialog 是最普通的顶级窗口。一个不会被嵌入到父窗口部件的窗口部件叫做顶级窗口部件。通常情况下,顶级窗口部件是有框架和标题栏的窗口(尽管使用了一定的窗口部件标记,创建顶级窗口部件时也可能没有这些装饰。)在Qt中,QMainWindow和不同的QDialog的子类是最普通的顶级窗口。
如果是顶级对话框,那就基于QDialog创建,如果是主窗体,那就基于QMainWindow,如果不确定,或者有可能作为顶级窗体,或有可能嵌入到其他窗体中,则基于QWidget创建。
当然了,实际中,你还可以基于任何其他部件类来派生。看实际需求了,比如QFrame、QStackedWidget等等。
2.QT关闭程序,使用哪个函数?如何使用
QT中关闭程序有三个方法:即quit(),exit()以及close()。
准确的讲close()不算是用来关闭程序的,它是用来关闭窗体的。
quit(),exit()是真正用来关闭程序的,quit()其实等于exit(0),它们是QCoreApplicaion(控制台程序中)或 QApplicaion(GUI程序中)的成员函数,一般我们可以使用全局变量qApp来调用这调用这两个函数对程序进行关闭。
如 connect( quitButton, SIGNAL(clicked()), qApp, SLOT(quit()) );
用close()和quit()的区别是,调用close()时,会产生一个QCloseEvent事件,而quit()及exit()不会,
如果你的窗体类重载了closeEvent(QCloseEvent *event)函数,就可以接收到这个close事件,并可以在这个函数中进行窗口关闭前的一些处理。
值得注意的是,当我们点击窗口的关闭“X”时,也会产生一个close事件。
小小:这些函数怎么使用?如何绑定到槽?全局变量qApp怎么使用
3.QString对象的比较方式?
这是QString==的源码
- bool operator==(const QString &s1,const QStringRef &s2)
- {
- return (s1.size() == s2.size() &&
- qMemEquals((const ushort *)s1.unicode(),
- (const ushort *)s2.unicode(), s1.size()));
- }
这是QString compare的代码
- int QString::compare(const QString &other) const
- {
- return ucstrcmp(constData(), length(), other.constData(), other.length());
- }
由于这两个函数都有很多的重载形式,所以选出两个具有代表性的出来说明问题。
从返回值来看可以知道,==相等的时候返回true,不等返回false。而compare则是按字典顺序的大于小于等于返回小于0,等于0和大于0三种结果。
4.QT中的对话框使用方法?
对话框在Qt GUI应用程序中有着广泛的用途,对话框有模态、非模态两种情况。
对于参数选择的对话框,一般用模态对话框;对于显示或查看某些内容的对话框,一般用非模态对话框。
对话框类QDialog,官方文档:http://qt-project.org/doc/qt-4.8/qdialog.html
4.1. 模态对话框
模态对话框通过调用exec()函数实现,使用模态对话框时,事件就在对话框内部循环,必须将对话框关闭才能继续执行主界面的操作。
需要注意的是,关闭模态对话框时,exec()将返回一个值。
原型:int QDialog::exec () [slot]
返回值利用:比如对话框中有Ok和Cancel两个按钮,点击Ok按钮时,关闭对话框同时主程序接受对话框中设置的参数,点击Cancel或右上角的X后,关闭对话框并且立即返回不再执行下面的程序。这种情况下,将 Ok按钮的clicked()信号与accept()槽连接,Cancel按钮的clicked信号与reject()槽连接。这时,当点击Ok按钮式, 将触发accept()槽,exec()返回QDialog::Recepted,当点击Cancel按钮时,将触发reject槽,exec()返回 QDialog::Rejected。
connect(ui.Ok,SIGNAL(clicked()),this,SLOT(accept()));
connect(ui.Cancel,SIGNAL(clicked()),this,SLOT(reject()));
执行时,进行一下判断,点击了Cancel返回,点击了Ok传递对话框中的参数继续执行
1 //在某个函数中调用对话框2 // a为对话框类对象3 if(a.exec() == QDialog::Rejected)4 {5 //操作6 return;7 }8 //传递对话框中的参数9 //继续操作
不知道说明白了没有,不明白的话自己下代码实现一下。
4.2. 非模态对话框
非模态对话框调用show()函数实现,当然在主程序中,调用非模态对话框时,如果只写个show(),可能是对话框一闪而过,为了解决这个情况,需要全局对象的事件响应槽processEvents(),定时的访问该对话框,这样就可以处理主界面的事件同时对话框也不会消失。
本人采用方法时利用QTimer类的singleShot()方法。QTimer类提供了对时钟的操作。
QTimer类的官方文档:http://qt-project.org/doc/qt-4.8/qtimer.html
singleShot的原型:void QTimer::singleShot ( int msec, QObject * receiver, const char * member ) [static]
第一个参数为执行的时间间隔,单位为ms
第二个参数为接受的对象
第三个参数为触发的槽
恰好,我们可以每隔msec时间触发processEvents(),从而使对话框不消失,第二个参数为对话框对象。需要注 意的是,对话框的对象要定义在堆上(即要定义成指针对象),因为如果定义在栈上,执行完后函数后对象会被自动清理掉,找不到第二个参数所需的对象,就没法 显示出对话框了。
#include <QTimer>
CModallessDialog *dialog; //最好定义成全局变量dialog = new CModallessDialog;dialog->show();dialog->setTitle(tr("非模态对话框")); //设置窗口标题//对话框中的一些处理QTimer::singleShot(200,dialog,SLOT(qApp->processEvents())); //时间间隔200ms
在使用时,将dialog对象delete掉之后对话框就会消失
//如果对话框显示,就将其删除if(NULL!=dialog){ delete dialog dialog=NULL;}
5.QT Designer中添加自定义槽函数的方式?
Qt Designer中提供了一"Singal/Slot Editor",对于已有的信号和槽,直接新建,选择相应的Signal和slot就好了。可是往往我们需要编写自己的Slot函数,这时应该怎么添加呢?有以下几种方法:
5.1.按照一定的格式规范命名Slot函数,setupUi()函数可以自动将符合on_objectName_signalName()命名的槽与形影的ObjectName的SignalName连接在一起。
例如UI里新建了一个openButton,在.h文件里声明void on_openButton_clicked()函数并在cpp文件里添加这个函数的定义后,seupUi()就可以自动将openButton的clicked信号与我们定义的slot函数联系在一起了!例如UI里新建了一个openButton,在.h文件里声明void on_openButton_clicked()函数并在cpp文件里添加这个函数的定义后,seupUi()就可以自动将openButton的clicked信号与我们定义的slot函数联系在一起了!
5.2.直接在.h文件和cpp文件里定义slot函数,例如void open();进入到Edit Signal and slots模式下,在我们要响应slot函数的控件上滑动鼠标左键,便会出来一个Configure connection的对话框,点Edit,这时我们需要的open函数出现啦,选择这个函数,就完成了信号和槽的连接。在Edit里我们还能新建新的槽,先新建,再添代码也能达到同样的目的。
QT杂记(网上资料整理而成)