QT 用比 SLOT 更少的参数连接一个 SIGNAL
Posted
技术标签:
【中文标题】QT 用比 SLOT 更少的参数连接一个 SIGNAL【英文标题】:QT connect a SIGNAL with fewer arguments than SLOT 【发布时间】:2018-08-19 16:51:49 【问题描述】:我有这个代码:
QObject::connect(lineEdit_1, SIGNAL(textChanged(const QString &)), MainWindow, SLOT(myMethod(const QString &, QLineEdit* )) );
当 myMethod 只有第一个参数(等于 SIGNAL)但 我需要将指针传递给 lineEdit_1 时,此代码可以正常工作为了让 myMethod 知道它必须在哪个 LineEdit 上运行。 我该怎么办?
非常感谢。
【问题讨论】:
【参考方案1】:您不必将为其发出信号的对象作为附加参数发送,QObject
s 具有允许我们获取该对象的sender()
方法:
QObject::connect(lineEdit_1, &QLineEdit::textChanged, MainWindow, &Your_Class::myMethod);
void Your_Class::MyMethod(const QString & text)
if(QLineEdit *le = qobject_cast<QLineEdit *>(sender()))
qDebug() << le;
如果你需要传递其他参数,你可以使用 lambda 函数,但总是要花时间看看限制(如何使用它取决于上下文):
QObject::connect(lineEdit_1, &QLineEdit::textChanged, [ /* & or = */](const QString & text)
MainWindow->MyMethod(text, another_arguments);
);
【讨论】:
谢谢,它有效。无论如何,我怎样才能传递另一个论点? (可能有用) 请注意,sender() 不能用于来自不同线程的调用。在实践中,我发现 lambda 技巧的使用非常通用,并且允许为不同的小部件动态创建具有捕获状态的处理程序。 @Swift-FridayPie 不应从另一个线程修改 QObject,lambda 是一个很好的资源,但你也必须小心。 @eyllanesc 有合法的方法..否则框架将限制为一个(几乎两个)线程,在现代术语中可能等于使用不到 5% 的可用资源。请注意,Qt 文档并没有说这种情况是非法的,它只是sender()
有一个固有的缺陷。随着时间的推移,“你做错了”被“没那么错”所取代。 :P
@eyllanesc 有一个connect
重载接受第二个QObject
作为“接收者”。如果您使用该参数传递实际的接收器,如果接收器已被销毁,Qt 将不会尝试调用插槽。如果您使用多个线程(和排队连接),如果您需要删除 receiver
,请务必使用 deleteLater
而不是普通的 delete
。以上是关于QT 用比 SLOT 更少的参数连接一个 SIGNAL的主要内容,如果未能解决你的问题,请参考以下文章
机器学习笔记:优化器Lion(EvoLved Sign Momentum)