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】:

您不必将为其发出信号的对象作为附加参数发送,QObjects 具有允许我们获取该对象的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的主要内容,如果未能解决你的问题,请参考以下文章

Qt--SLOT槽函数相关

机器学习笔记:优化器Lion(EvoLved Sign Momentum)

左连接在查询后返回更多和更少的行

HttpClient vs HttpWebRequest 以获得更好的性能、安全性和更少的连接

没有 SLOT 宏的 Qt 连接

关于QT中的signal 和 slot 中带参数问题