qt4连接按钮中的点击信号不会触发标签中的settext

Posted

技术标签:

【中文标题】qt4连接按钮中的点击信号不会触发标签中的settext【英文标题】:qt4 the clicked signal in the connect button doesn't trigger the settext in the label 【发布时间】:2021-10-05 12:59:39 【问题描述】:

应用程序运行正常,但 clicked() 信号不会触发标签的 setText()。任何提示为什么它没有?

#include <QApplication>
#include <QLabel>
#include <QPushButton>
#include <QHBoxLayout>
#include <QWidget>
#include <QObject>

int main(int argc, char *argv[])

    QApplication app(argc, argv);

    QWidget *window = new QWidget;

    QLabel *label = new QLabel("hello");
    QPushButton *button = new QPushButton;
    button->setText("change");

    QObject::connect(button, SIGNAL(clicked()), label, SLOT(setText("<h1>hello</h1>")));

    QHBoxLayout *layout = new QHBoxLayout;
    layout->addWidget(label);
    layout->addWidget(button);
    window->setLayout(layout);

    window->show();

    return app.exec();

【问题讨论】:

【参考方案1】:

连接中的参数必须指明信号和槽之间的签名,即它们必须指明发送信号和接收槽的对象的类型。在这种情况下,放置"&lt;h1&gt;hello&lt;/h1&gt;" 是没有意义的。一种可能的解决方案是创建一个继承自 QLabel 的类,并在该方法中实现一个更改文本的槽。

#include <QApplication>
#include <QLabel>
#include <QPushButton>
#include <QHBoxLayout>
#include <QWidget>
#include <QObject>

class Label: public QLabel
    Q_OBJECT
public:
    using QLabel::QLabel;
public slots:
    void updateText()
        setText("<h1>hello</h1>");
    
;

int main(int argc, char *argv[])

    QApplication app(argc, argv);

    QWidget window;

    Label *label = new Label("hello");
    QPushButton *button = new QPushButton;
    button->setText("change");

    QObject::connect(button, SIGNAL(clicked()), label, SLOT(updateText()));

    QHBoxLayout *layout = new QHBoxLayout;
    layout->addWidget(label);
    layout->addWidget(button);
    window.setLayout(layout);

    window.show();

    return app.exec();


#include "main.moc"

在 Qt5 和 Qt6 中不再需要实现类,因为可以使用 lambda 函数。

#include <QApplication>
#include <QLabel>
#include <QPushButton>
#include <QHBoxLayout>
#include <QWidget>
#include <QObject>


int main(int argc, char *argv[])

    QApplication app(argc, argv);

    QWidget window;

    QLabel *label = new QLabel("hello");
    QPushButton *button = new QPushButton;
    button->setText("change");

    QObject::connect(button, &QPushButton::clicked, label, [label]()
        label->setText("<h1>hello</h1>");
    );

    QHBoxLayout *layout = new QHBoxLayout;
    layout->addWidget(label);
    layout->addWidget(button);
    window.setLayout(layout);

    window.show();

    return app.exec();

【讨论】:

以上是关于qt4连接按钮中的点击信号不会触发标签中的settext的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Qt Creator 将按钮单击信号(“触发”信号)与工具栏中的用户按钮的动作/插槽功能连接起来?

QT中的信号与事件,多线程

QML - .qml 文件中的“连接”不会触发来自 python 脚本的信号

PyQt5快速上手基础篇2-按钮控制LCD屏显示

在调整屏幕大小时,当移动到溢出按钮时,工具栏中的SplitButton不会触发点击处理程序。

Qt4 中的信号和槽