【问题标题】:Qt Slots and Signals. Get Slot Receiver ObjectQt 插槽和信号。获取槽接收器对象
【发布时间】:2016-07-04 14:10:33
【问题描述】:

我有一个 QLineEdit,我想将它连接到一个 QLabel,以便根据输入文本的有效性。这样做时我遇到了两个问题。

QLineEdit *text = new QLineEdit(this);
layout->addWidget(text, rowno, 0);
QLabel *button = new QLabel(this);
button->setStyleSheet("QLabel { background-color : green; color : white; }");
button->setAlignment(Qt::AlignCenter);
button->setText("OKAY");
QObject::connect(text, SIGNAL(textEdited(const QString &)), button, SLOT(CheckValidity(const QString &)));

这不会将 QLineEdit 中所做的任何更改连接到我的自定义插槽。我不知道为什么! 同样在自定义插槽中,我想根据传递的 QString 更改标签的背景颜色。如何获得标签的参考?它作为信号的接收器存在,但我无法找到引用它的方法。

【问题讨论】:

    标签: c++ qt qt5.5


    【解决方案1】:

    CheckValidity 不是QButton 的插槽,它是在您自己的类中定义的自定义插槽(我假设是,因为您没有指定它)。

    所以,把最后一行改成:

    QObject::connect(text, SIGNAL(textEdited(const QString &)), this, SLOT(CheckValidity(const QString &)));
    

    如果你想知道发送者对象,使用qobject_cast

    QLabel *sender_label = qobject_cast<QLabel*> (sender ());
    

    【讨论】:

    • 我可以在自定义槽中将标签作为参数传递吗?我相信 QT 信号和插槽需要具有相同数量的参数,但我需要将特定标签与特定文本框连接起来,并且它们是由用户在运行时动态创建的,因此我无法在我的类中保留对它的引用。
    【解决方案2】:
    1. QLabel 中没有CheckValidity 插槽(为什么buttonQLabel?)。尝试连接后检查调试器的输出窗口。
    2. QObject::sender() + 演员表。演员可能是dynamic_castqobject_cast,看看他们在Qt Assistant 中的区别。

    【讨论】:

      【解决方案3】:

      如果你想为你的槽调用提供额外的参数,你可以使用 lambda 代替槽:

      QObject::connect(text, &QLineEdit::textEdited, [=](const QString &text) { checkValidity(button, text); });
      

      【讨论】:

        猜你喜欢
        • 2012-10-15
        • 1970-01-01
        • 2015-03-14
        • 1970-01-01
        • 2021-08-28
        • 2012-09-11
        • 1970-01-01
        • 2015-07-18
        • 2013-09-27
        相关资源
        最近更新 更多