gpt4 book ai didi

c++ - QPushbutton 没有连接

转载 作者:行者123 更新时间:2023-11-30 02:55:32 24 4
gpt4 key购买 nike

在下面的代码中,我试图在按下“单击”按钮时用“新文本”替换“原始文本”。我没有收到任何错误,但标签的文本没有改变。

 QPushButton *button=new QPushButton("click");

QLabel *label=new QLabel("original text");
QVBoxLayout *layout=new QVBoxLayout();
QString word("new text");
QWidget *window=new QWidget();

layout->addWidget(button);
layout->addWidget(label);
QPushButton :: connect(button,SIGNAL(clicked()),layout,SLOT(setText(word)));
window->setLayout(layout);
window->show();

最佳答案

这里的要点是信号和槽的签名应该兼容。换句话说,您不能将信号 clicked() 连接到插槽 setText(QString const&) 只是因为 setText 具有不同的签名,即接受参数QString const& 类型。

你可以做的是创建一个“forwarding”类来定义你的自定义无参数插槽setText,这样它就可以连接到信号clicked() ,例如:

class Forwarder: public QObject {
Q_OBJECT

public:
Forwarder(QObject* parent = 0): QObject(parent),
word("new text"),
label(new QLabel("original text")) {
QPushButton* button = new QPushButton("click");
QVBoxLayout* layout = new QVBoxLayout();
QWidget* window = new QWidget();

connect(button, SIGNAL(clicked()), this, SLOT(setText()));

layout->addWidget(button);
layout->addWidget(label);
window->setLayout(layout);
window->show();
}

protected Q_SLOTS:
void
setText()
{ label->setText(word); }

private:
QLabel* label
QString word;
};

请注意您的自定义 setText 如何连接到 clicked,并且仅将 setText 调用转发到 label .

您的代码中还有两点错误:

  • 不能在连接期间传递实例,例如:

    ...
    QString word("new text");
    ...
    connect(button, SIGNAL(clicked()), layout, SLOT(setText(word))); // Odd!
    ...
  • 您可能打算连接到 label 而不是 layout。因为你想改变 label 上的文本,你需要调用setText 方法用于label,而不是layout。此外,布局(作为指向 QLayout 类实例的指针)甚至没有 setText 方法。

我鼓励您重新阅读文档,以了解为什么上面介绍的方法是有效的,而您的方法不是,而且永远不可能。

关于c++ - QPushbutton 没有连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16402532/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com