1

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

 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();
4

1 回答 1

3

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

您可以做的是创建一个“转发”类,该类将定义您的自定义无参数插槽setText,以便它可以连接到 signal 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。此外,layout (作为指向QLayout类实例的指针)甚至没有setText方法。

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

于 2013-05-06T16:23:44.267 回答