主要這裏的一點是,信號和槽的簽名應該是兼容。換句話說,僅僅因爲setText
具有不同的簽名,即接受QString const&
類型的參數,所以不能將信號clicked()
連接到槽setText(QString const&)
。
你可以做的是創造一個「轉發」類會定義自定義參數的插槽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
。此外,layout
(作爲指向QLayout
類的實例的指針)甚至沒有setText
方法。
我鼓勵你重新讀取文檔進行排序的感覺,爲什麼上面介紹的方法是有效的,而你不是,絕不可能。
該方法是錯誤的,我建議你重讀文檔。簡而言之,在連接期間不能指定像「word」這樣的實例。 – 2013-05-06 16:06:09
我試過這個,而不是QPushButton :: connect(button,SIGNAL(clicked()),layout,SLOT(setText(「new text」))); – g3nair 2013-05-06 16:07:58
也沒有工作! – g3nair 2013-05-06 16:08:27