QT工作学习笔记
1 | menu->exec(QCursor::pos()); |
menu->exec()和menu->popup的区别:
https://www.cnblogs.com/qianguyihao/p/4133292.html
1 | QApplication::setOverrideCursor(Qt::WaitCursor);//设置鼠标为等待光标 |
Qt中foreach及QList的使用
QList是一个最常用的容器类,用它定义一个对象通常是
QList
其中int代表给定的类型,也就是说现在定义了一个有符号整形的容器,让后给里面装值
list<<2<<3<<4<<6;
现在就可以使用foreach(int i,list)这样就可以遍历整个容器了
它告诉QT不要定义moc关键字signals,slots和emit,因为这些名字可能将被用于第三方库,例如Boost。你只需简单的用QT宏将他们替换为 Q_SIGNALS, Q_SLOTS,和 Q_EMIT,就可以继续使用信号和槽了。
QDateTime日期操作
resizeColumnToContents
restoreOverrideCursor:撤销最近一次的setOverrideCursor()。
QRegExp是Qt的正则表达式类Qt中有两个不同类的正则表达式.
qRegisterMetaType的使用
情景:自己定义的类型如果想使用signal/slot来传递的话
当一个signal被放到队列中(queued)时,它的参数(arguments)也会被一起一起放到队列中(queued起来),这就意味着参数在被传送到slot之前需要被拷贝、存储在队列中(queue)中;为了能够在队列中存储这些参数(argument),Qt需要去construct、destruct、copy这些对象,而为了让Qt知道怎样去作这些事情,参数的类型需要使用qRegisterMetaType来注册
步骤:(以自定义TextAndNumber类型为例)
1 | 自定一种类型,在这个类型的顶部包含: |
QVariant 这个类型充当着最常见的数据类型的联合。QVariant 可以保存很多Qt的数据类型,包括QBrush、QColor、QCursor、QDateTime、QFont、QKeySequence、 QPalette、QPen、QPixmap、QPoint、QRect、QRegion、QSize和QString,并且还有C++基本类型,如 int、float等。
当然,如果支持的类型没有想要的,没关系,QVariant也可以支持自定义的数据类型。被QVariant存储的数据类型需要有一个默认的构造函数和一个拷贝构造函数。为了实现这个功能,首先必须使用Q_DECLARE_METATYPE()宏。通常会将这个宏放在类的声明所在头文件的下面:Q_DECLARE_METATYPE(MyClass)
QSpinBox是一个主要处理整数和离散值集合的步长调节器控件,它允许用户通过单击增减按钮或用键盘输入值来实现当前显示值的改变。它主要显示整数,也可以通过自定义显示一些离散的值集(周一~周日)
QMimeData类提为数据提供一个容器,用来记录关于MIME类型数据的信息
QMimeData常用来描述保存在剪切板里信息,或者拖拽原理
QMimeData对象把它所保存的信息和正确的MIME类型连接起来来保证信息可以被安全的在应用程序之间转移,或者在同一个应用程序之间拷贝
QUrl 类提供了一个方便的接口使用 URLs。它可以解析和构造编码和未编码形式的 URLs
在QT界面设置中,多个ui文件共同生成一个界面的原因是因为在大的那个ui界面中,空白区域的名称刚好对应其他的ui界面的文件名称,因此才能组合成一个文件
在Qt中经常需要弹出窗口,QMessageBox可以实现此功能,一共有三种窗口,information, question, 和 warning,critical, about分别对应感叹号,问号和叉号等等,使用方法很简单,一共有三个参数,第一个是父窗口句柄,剩下两个分别为窗口名称和显示内容
宏定义Q_DECLARE_METATYPE的作用
自定义类型被封装成了QVariant的形式,这样,我们自定义的T类型的对象就能够通过所有参数和返回值为QVarian类型传递
注:Qt中QVariant是多种类型的联合,QVariant类中有个SetValue(T& value)方法,将自定义 T 类型的数据保存到QVariant对象中。
自定义类型情况:
1 | struct Test |
自定义类或结构体:
1 | nameSpace A |
注意:用QVariant设置一个自定义指针类型的Data,这时就需要Q_DECLARE_METATYPE(Type*)了,如果设置了Q_DECLARE_METATYPE(Type),Qt只能识别Type类型,而未能识别其指针类型!!!另外自定义类型中一定要有默认构造函数,如果已经显式的定义了带有无默认参数的构造函数则需要另外写上默认构造函数 Test(){}。还有为保证不出其他莫名其妙的错误,最好在类定义的头文件中加上#include
Qt插件开发
步骤:
1、定义一个接口集(只有纯虚函数的类),用来与插件交流。
2、用宏Q_DECLARE_INTERFACE()将该接口告诉Qt元对象系统。
3、应用程序中用QPluginLoader来加载插件。
4、用宏qobject_cast()来判断一个插件是否实现了接口。
步骤一、二:
1 | #ifndef ECHOINTERFACE_H |
插件类EchoPlugin,实现如下:
EchoPlugin.h文件:
1 | #ifndef ECHOPLUGIN_H |
EchoPlugin.cpp文件:
1 | #include "EchoPlugin.h" |
1 | #ifdef WIN32 |
使用QLibrary加载动态库
https://blog.csdn.net/amnes1a/article/details/69055858
QT dll文件读取
1 | inline QString toAbsolutePath(const QString &filePath, const QString &fileName) |
注意:一般编写程序时,严格来说,启动外部程序,需要判断版本是debug还是release。否则,有可能会造成错误(特别是在采用Qt 进程通信功能的时候)
1 |
|
1) 在线程间使用信号槽进行通信时,槽参数必须使用元数据类型的参数;
2) Qt内生的元数据类型,如int double QString等;
3) 如果要用自定义的数据类型,需要在connect之前将其注册(qRegisterMetaType)为元数据类型。
4) 线程间用“信号与槽”传递引用参数的话,要加const,因为const文字常量存在常量区中,生命周期与程序一样的长。这样可以避免slot调用的时候参数的运行期已过而使引用无效。
1 | connect(m_thread, SIGNAL(MsgSignal(const QString&)), |
传递自定义参数(子线程与子线程)
把connect函数中的第三参数this(主线程)改成要监听的另一个线程对象就好。.前提是全部的线程,都要在主线程里面实例化(new)。
传递自定义结构体参数(子线程与子线程)
头文件 ABFThread.h:
1 |
|
注意:void parameterPassing(abfThread::G_ABFTableSrcUnit); //线程自己调用自己的结构体。。。必须这么写不然主线程会报错的 错误是参数内容不一样
1 | connect(radarInterface,SIGNAL(sendString(abfThread::G_ABFTableSrcUnit)),m_ABF,SLOT(parameterPassing(abfThread::G_ABFTableSrcUnit))); |
详见:https://blog.csdn.net/hebbely/article/details/79428336
注意:多线程间的信号槽传递,在connect的时候需要以Qt::QueuedConnection的方式,不然以Qt::DirectConnection的方式接收者UI线程会很长时间收不到后台线程发出的信号,或者信号直接丢失都是有可能的