2013-05-06 101 views
1

在下面的代碼中,我試圖用「新文本」替換「原文」,當點擊按鈕被按下時。我沒有得到任何錯誤,但標籤的文字不會改變。QPushbutton沒有連接

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(); 
+1

該方法是錯誤的,我建議你重讀文檔。簡而言之,在連接期間不能指定像「word」這樣的實例。 – 2013-05-06 16:06:09

+0

我試過這個,而不是QPushButton :: connect(button,SIGNAL(clicked()),layout,SLOT(setText(「new text」))); – g3nair 2013-05-06 16:07:58

+0

也沒有工作! – g3nair 2013-05-06 16:08:27

回答

3

主要這裏的一點是,信號和槽的簽名應該是兼容。換句話說,僅僅因爲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方法。

我鼓勵你重新讀取文檔進行排序的感覺,爲什麼上面介紹的方法是有效的,而你不是,絕不可能。

+0

非常感謝!我現在正在再次閱讀文檔,並慢慢清楚爲什麼我的代碼不起作用。是的,我的意思是使用標籤。再次感謝。 – g3nair 2013-05-06 17:04:28