【问题标题】:QT connect a SIGNAL with fewer arguments than SLOTQT 用比 SLOT 更少的参数连接一个 SIGNAL
【发布时间】: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 上运行。 我该怎么办?

非常感谢。

【问题讨论】:

    标签: c++ qt c++11 qt5


    【解决方案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
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-24
    相关资源
    最近更新 更多