这里的重点是 signal 和 slot 的签名应该兼容。换句话说,您不能仅仅因为具有不同的签名而将信号连接clicked()
到插槽,即接受类型的参数。setText(QString const&)
setText
QString 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
方法。
我鼓励您重新阅读文档,以了解为什么上面介绍的方法是有效的,而您的方法不是,而且永远不可能。