用凡科网做网站怎么保存到桌面,asp建站系统源码,泉州网站建设电话,网站内容优化Qt 信号与槽的使用详解 - 多种绑定形式、同步异步、Lambda表达式等 引言一、信号与槽常见的绑定形式二、信号与槽的连接方式 - 同步异步 引言
在Qt框架中#xff0c;信号与槽#xff08;Signals and Slots#xff09;机制是一种强大的通信方式#xff0c;它允许对象之间进… Qt 信号与槽的使用详解 - 多种绑定形式、同步异步、Lambda表达式等 引言一、信号与槽常见的绑定形式二、信号与槽的连接方式 - 同步异步 引言
在Qt框架中信号与槽Signals and Slots机制是一种强大的通信方式它允许对象之间进行通信而无需知道彼此的详细实现。这种机制是Qt的核心特性之一广泛应用于事件处理和对象间的通信能够大大简化编程的复杂性提高代码的可维护性和可扩展性。
一、信号与槽常见的绑定形式
使用connect连接信号 (槽函数的参数个数必须小于等于信号函数的参数个数) connect函数指针 (推荐)例程如下 QMetaObject::Connection QObject::connect(const QObject *sender, PointerToMemberFunction signal, const QObject *receiver, PointerToMemberFunction method, Qt::ConnectionType type Qt::AutoConnection) QLabel *label new QLabel;QLineEdit *lineEdit new QLineEdit;QObject::connect(lineEdit, QLineEdit::textChanged,label, QLabel::setText);connect(ui-pushButton, QPushButton::clicked, this, MainWindow::slot_cs); // slot_cs是一个普通的槽函数Qt 5中推荐的信号与槽连接语法支持函数提示 - 函数补全会在编译时检查到连接错误 Lambda表达式(推荐) - 连接和槽函数的实现写在一切方便、简洁且直观例程如下 QMetaObject::Connection QObject::connect(const QObject *sender, PointerToMemberFunction signal, const QObject *context, Functor functor, Qt::ConnectionType type Qt::AutoConnection) QByteArray page ...;QTcpSocket *socket new QTcpSocket;socket-connectToHost(qt-project.org, 80);QObject::connect(socket, QTcpSocket::connected, this, [] () {socket-write(GET page \r\n);}, Qt::AutoConnection);lambda表达式(函数)详解:https://blog.csdn.net/LF__plus/article/details/136873469 - 表达式结构、参数解释 还有个类似的QMetaObject::Connection QObject::connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)少了接受者。 标准connect连接(不推荐) - QT4老语法例程如下 QMetaObject::Connection QObject::connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type Qt::AutoConnection) QLabel *label new QLabel;QScrollBar *scrollBar new QScrollBar;QObject::connect(scrollBar, SIGNAL(valueChanged(int)),label, SLOT(setNum(int)));需要注意signal和slots参数不能包含任何变量名只能包含类型。相比connect函数指针的连接方式不能进行函数补全由于使用宏将信号和槽函数转换为字符串如果有问题在运行时候才会报错编译阶段不检查。 还有一个类似的QMetaObject::Connection QObject::connect(const QObject *sender, const QMetaMethod signal, const QObject *receiver, const QMetaMethod method, Qt::ConnectionType type Qt::AutoConnection)使用QMetaMethod作为信号和槽函数而不是字符串. 界面上设置 1)- 右键控件 - 点击转到槽 - 点击相应的信号自动生成相应的槽函数默认绑定无需connect 2)- 在ui设计界面底部添加信号和槽的对应关系如下图所示 … 一般用的不多的知识点 将一个信号连接到另一个信号上当第一个信号发射时会触发第二个信号信号和槽可以重载使用QOverload 和 QMetaObject::Connection处理重载信号和槽一个信号可以连接多个槽一个槽也能被多个信号连接使用disconnect断开信号和槽的连接一个信号和一个槽函数和进行多次connect连接一次触发多次执行… 可以设置连接类型来规避这种情况UniqueConnection发送信号不用加emit也行 可参考 Qt中connect()方法的一些常见用法:https://blog.csdn.net/weixin_42478379/article/details/137682367QT标准connect连接QT4老语法:https://zhuanlan.zhihu.com/p/692721646QT 信号与槽4种绑定形式:https://blog.csdn.net/weixin_42127524/article/details/131189259槽函数被执行多次的解决方法及Qt::UniqueConnection作用及和其它连接类型的“与”操作写法:https://blog.csdn.net/danshiming/article/details/123162126Qt信号槽/使用问题:https://blog.csdn.net/quguanxin/article/details/102843961 二、信号与槽的连接方式 - 同步异步
信号与槽的连接最后有一个枚举参数Qt::ConnectionType type Qt::AutoConnection默认自动。此参数主要表示信号是立即发出还是排队等待
常量值 描述 Qt::AutoConnection0(默认) 发送接收在同一线程则Qt::DirectConnection否则Qt::QueuedConnectionQt::DirectConnection1发出信号时会立即槽函数在信号发出者的线程中执行。Qt::QueuedConnection2在接受者的事件循环(线程)中调用。- 异步Qt::BlockingQueuedConnection3和Qt::QueuedConnection一样也在接受者线程中调用但是发送信号的线程会被阻塞直到槽函数执行完毕 (防止槽函数和信号线程对某个值的操纵冲突)。 - 同步Qt::UniqueConnection0x80一个标志可以与上述连接方式进行组合 保证同一信号和同一槽函数只能连接一次再次connect连接会失败。 对于排队连接Qt::QueuedConnection参数必须是Qt的元对象系统已知的类型因为Qt需要复制参数以将其存储在幕后事件中。如若是自定义类型可以使用qRegisterMetaType()注册一下。对于Qt::BlockingQueuedConnection不能用于发送者接受者在同一个线程的情况会引起死锁。 - (为啥可参考博客由Qt::BlockingQueuedConnection引起的关闭Qt主页面而后台仍有进程残留https://blog.csdn.net/youzai2017/article/details/132746319)当Lambda表达式作为槽函数时记得使用以上推荐的方式写全参数。如果省略接受者默认会在发送者的线程中直接执行。- 比如一个线程发出信号主线程(UI)线程响应修改相关UI不写接受者是主线程会冲突报错因为只有主线程(UI)线程可以修改UI。