2009-04-28 35 views
0

我目前正在嘗試使用Qt4和C++來完成一個項目。我正在使用按鈕在狀態之間切換。雖然試圖連接按鈕的點擊()信號到文本編輯顯示相關的狀態,我就死在了一個錯誤:只有Qt4現有的插槽不被識別

Object::connect No such slot QTextEdit::append("move state") Object::connect No such slot QTextEdit::append("link state")

,的QTextEdit肯定有追加(QString的)插槽。

任何想法?

某些代碼樣品:

QPushButton *move = new QPushButton("Move"); 
connect(move, SIGNAL(clicked()), textEdit, SLOT(append("move state"))); 

回答

6

使信號以槽連接時,可以不通過在一個參數(字面)到append()槽。

你是指它像一個方法簽名:

SLOT(append(QString)) //or const QString, I'm not sure 

如果您需要的文本框追加的話「移動狀態」這個按鈕被點擊每一次,那麼你應該定義自己的槽,將盡追加。

+0

這不起作用。你的意思是把方法簽名放在引號中嗎?謝謝。 – pypmannetjies 2009-05-03 14:25:14

+0

哦,糟糕,對不起,我在Qt和PyQt中工作,並使用錯誤的語法。是的,絕對不意味着報價大聲笑... – 2009-05-03 16:33:53

+0

感謝您的幫助 – pypmannetjies 2009-05-10 22:12:42

4

克里斯簡而言之就是它。

這是我喜歡boost :: signals的很多原因之一(你可以使用boost :: bind)。你基本上需要創建另一個捕獲信號的函數,然後執行附加。

... 

QPushButton *move = new QPushButton("Move"); 
connect(move, SIGNAL(clicked()), textEdit, SLOT(MoveState())); 
} 

... 

void MyTextEdit::MoveState() 
{ 
    append("move state"); 
} 
1

假設你有其他QPushButton s表示將引起其他國家,你可以把他們QButtonGroup內。然後,您可以使用枚舉,例如{ MOVE_ID, STOP_ID, ... }來引用可能的狀態。

QPushButton* move = new QPushButton("Move") ; 
QPushButton* stop = new QPushButton("Stop") ; 
QButtonGroup* buttonGroup = new QButtonGroup() ; 
buttonGroup->addButton(move, MOVE_ID) ; 
buttonGroup->addButton(stop, STOP_ID) ; 

// Connecting QButtonGroup to writing function 
connect(buttonGroup, SIGNAL(buttonClicked(int)), 
     textEdit, SLOT(append(int))) ; 

textEdit,你將定義這取決於你的狀態附加相應的文本的功能。

void append(int i) 
{ 
    switch (i) 
    { 
     case MOVE_ID: 
     textEdit->append("move state") ; 
     break ; 
     case STOP_ID: 
     textEdit->append("stop state") ; 
     break ; 
    } 
} 
3

使用QSignalMapper將硬編碼參數傳遞到文本編輯的插槽。

實施例:

QSignalMapper* signalMapper = new QSignalMapper(this); 
QPushButton* move = new QPushButton("Move"); 
signalMapper->setMapping(move, QString("move state")); 
connect(move, SIGNAL(clicked()), signalMapper, SLOT(map())); 
connect(signalMapper, SIGNAL(mapped(QString)), textEdit, SLOT(append(QString))); 

當心在上面的代碼中的錯誤。