QT 警告 QObject::connect: Cannot queue arguments of type

需求 qt 程序在运行过程中,报了警告 QObject::connect: Cannot queue arguments of type 'qintptr' 解决 跨线程的信号和槽中,如果出现自定义的类型,那么就会报这个问题。解决也很简单。 在使用这个自定义类的信号和槽的类源文件中,增加头文件 #include <QMetaType>. 在这个类的构造函数中添加 qRegisterMetaType #include <QMetaType> TcpSocket::TcpSocket(qintptr socketDescriptor, QObject *parent) : QTcpSocket(parent), socketID(socketDescriptor) { qRegisterMetaType<qintptr>("qintptr"); this->setSocketDescriptor(socketDescriptor); ... } 参考 QObject::connect: Cannot queue arguments of type “xxx"的解决方案 Qt 线程间信号槽传递自定义数据类型(qRegisterMetaType的使用) QObject::connect: Cannot queue arguments of type…【已解决】

<span title='2023-07-23 17:34:00 +0800 CST'>2023-07-23</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;47 words&nbsp;·&nbsp;RamLife

QT QMetaObject 介绍

需求 QMetaObject ? 解决 QMetaObject 是 Qt 的元对象系统,里面保持了类的相关信息,主要的作用是为了在有指针的情况下,获取这个指针具体的类型信息,方便调试;另外也是 Qt 实现信号和槽的基础。毕竟 C++ 只有 dynamic_cast 用来试探子类型, typeid 只能获取类型名称,其他类型相关信息都不能获取。 由于C++是静态类型语言,有关类的信息只在编译期被使用,编译后就不再保留,因此程序运行时无法获取类的信息。这时就需要使用「运行期类型信息」,即 RTTI(Run-Time Type Information)。 参考 Qt中的元对象系统(Meta-Object System) Qt元对象系统:QMetaObject

<span title='2023-07-22 17:57:00 +0800 CST'>2023-07-22</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;24 words&nbsp;·&nbsp;RamLife

c++ warning: hides overloaded virtual function

需求 C++ 中警告: tcp_socket.h:15:10: warning: 'TcpSocket::readData' hides overloaded virtual function qabstractsocket.h:215:12: note: hidden overloaded virtual function 'QAbstractSocket::readData' declared here: different number of parameters (2 vs 0) 解决 这个问题的原因很简单,就是子类里面重载了父类的虚函数,被重载的虚函数在子类中将会被隐藏。 何为隐藏呢,应该是不能使用子类实例直接调用父类被隐藏的函数,调用时必须指定父类命名空间,往深了说也就是编译器如果在子类中发现了要使用的函数的名字,注意,是名字不包含函数签名,只要名字匹配上,就不会再去父类中去寻找这个名字的函数,即便子类中的函数参数不匹配,也不会再去父类中寻找。 原因 注意是防止书写错误,比如下面这个,如果在子类定义的时候,想的是重写 void foo(BookA *), 结果把 A 写成 B 了,那么这个警告就能提醒了。 class BookA; //改动处 class BookB; //改动处 class A { public: virtual void foo(BookA *) { //改动处 cout << "foo of A" << endl; } }; class B : public A{ public: void foo(BookB *) { //改动处 cout << "foo of B" << endl; } }; int main(void) { A *b = new B(); //改动处 b->foo(new BookB()); return 0; } 解决警告 如果确实是需要重载,又不希望有这个警告碍眼,可以使用 private 加上 using 来解决。 private 是为了防止子类的对象来使用父类的这个虚函数。...

<span title='2023-07-22 17:21:00 +0800 CST'>2023-07-22</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;141 words&nbsp;·&nbsp;RamLife

QT qintptr 介绍

需求 qintptr ? 解决 这个是 qt 为了跨平台用的,特别是有些情况,硬件平台可能是 32bit 或者 64bit。 qintptr 表示指针类型,占用空间和 int 一样,依赖于硬件实现, 32bit 平台那就是 32bit, 64bit 平台那就是 64bit。这样在用户代码层面便于统一。 qintptr 和 quintptr 都是指针,只不过一个是 有符号数,一个是无符号数。 qintptr 这个有符号的类型对于 hasing 等情况比较方便。 参考 <Qt help> -> <QtGlobal>::qintptr

<span title='2023-07-22 14:00:00 +0800 CST'>2023-07-22</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;34 words&nbsp;·&nbsp;RamLife

QT 使用基于 libev 的事件调度器 qt_eventdispatcher_libev

需求 qt 使用高性能事件调度器 解决 可以使用基于 libev 的事件调度器 qt_eventdispatcher_libev 安装 qt_eventdispatcher_libev 在源码目录中新建 eventdispatcher_libev 目录,增加 pri 文件。 复制 https://github.com/sjinks/qt_eventdispatcher_libev 的 src 目录中的文件,删除 win32 等无关文件。 在 pro 文件中,添加 pri 文件 编译看是否有错误。 使用 qt_eventdispatcher_libev main.cpp 中添加头文件 #include "eventdispatcher_libev/eventdispatcher_libev.h" 在 main() 最开始的地方添加 QCoreApplication::setEventDispatcher(new EventDispatcherLibEv()); int main(int argc, char *argv[]) { QCoreApplication::setEventDispatcher(new EventDispatcherLibEv()); QCoreApplication a(argc, argv); return a.exec(); } *注: qt help 中说明 QCoreApplication::setEventDispatcher 使用的地方 That is, before QCoreApplication has been instantiated. * 参考 基于 libev 的 Qt 事件调度器:qt_eventdispatcher_libev...

<span title='2023-07-22 10:33:00 +0800 CST'>2023-07-22</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;77 words&nbsp;·&nbsp;RamLife

QT 打开子界面

需求 qt 父界面,如何打开子界面窗口 解决 void MainWindow::on_action_2_triggered() { // 科室 DepartmentManage * department = new DepartmentManage(test_info_, this); department->setAttribute(Qt::WA_DeleteOnClose); department->setWindowTitle("科室管理"); department->exec(); } 参考 QT·页面跳转,怎么切换到另一个界面 QT通过点击按钮弹出新的窗口(新建弹出式窗口) 对话框QDialog

<span title='2023-07-17 11:53:00 +0800 CST'>2023-07-17</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;24 words&nbsp;·&nbsp;RamLife

QT 按钮关闭窗口

需求 qt 按钮关闭窗口调用什么 api ? 解决 一般可以调用 hide(), setVisible(false), close() 这些来关闭窗口。 hide() 基本等效于 setVisible(false) close() 是通过 QCloseEvent 来隐藏窗口。只有开启了 Qt::WA_DeleteOnClose 这个属性,才会真正的删除。 参考 QT界面窗口的显示和隐藏,关闭 Qt 关闭应用程序和窗口的函数(quit(),exit()以及close()的区别) QT中的closeEvent方法 Qt实现关闭窗口触发事件 Qt:closeEvent函数不调用的问题 Qt中的close和closeEvent 【QT】Dialog退出事件

<span title='2023-07-17 11:43:00 +0800 CST'>2023-07-17</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;29 words&nbsp;·&nbsp;RamLife

QT RadioButton 分组

需求 qt QRadioButton 如何分组? 解决 QRadioButton 分组有多种方法: QGroupBox 这样的组合框 QWidget QButtonGroup 参考 Qt的Radio Button(单选按钮) QT QRadioButton使用详解

<span title='2023-07-06 11:43:00 +0800 CST'>2023-07-06</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;16 words&nbsp;·&nbsp;RamLife

QT QLineEdit 添加 label,清除按钮

需求 qt QLineEdit 很多时候需要在前面加上一个标签,后面加上一个清除按钮。 解决 清除按钮 高版本 qt 自身就支持清除按钮,可以在 designer 中,勾选 clearButtonEnabled 属性. 添加 label 这个自有自定义一个 LineEdit 才行了,可以继承 QLineEdit, 然后设置 LineEdit 的布局为横向布局,然后把 QLabel 添加进来即可。 在 designer 中使用的时候,可以先放一个 QLineEdit, 然后提升为自定义的 LineEdit 即可。 参考 三种方法为QLineEdit添加清除内容按钮 C++ Qt自定义控件QLineEdit,简单 Qt之自定义用户名输入框 QLineEdit+QLabel+QComboBox 带输入自动提示补全和历史登录用户记忆 Qt之自定义搜索框——QLineEdit里增加一个Layout,还不影响正常输入文字(好像是一种比较通吃的方法) 【Qt】常用控件(QLabel,QLineEdit以及自定义控件)

<span title='2023-07-05 18:17:00 +0800 CST'>2023-07-05</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;40 words&nbsp;·&nbsp;RamLife

QT QFrame 占位添加 widget

需求 qt QFrame 有什么作用? 解决 占位 可以由 UI 工程师先使用 QFrame 占位,固定好整体布局,后续的实际的 widget 添加到 QFrame 中即可。 添加 widget QFrame 占位之后,还是需要使用 layout 来管理需要添加进去的 widget, 如果不用 layout, 可能会发生 widget 都在 (0, 0) 处,并且 resize 窗口之后,可能不会自动调整内部 widget. chartView = new ChartBriefView(createScatterChart()); auto layout = new QVBoxLayout(); layout->addWidget(chartView); ui->frame->setLayout(layout); 参考 QtDesigner+QWidget占位设计 QT的布局关键之一QFrame Adding a widget to a QFrame 第二十九章、containers容器类部件QFrame框架部件详解

<span title='2023-07-05 17:16:00 +0800 CST'>2023-07-05</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;54 words&nbsp;·&nbsp;RamLife