2011-06-05 71 views
0

只需單擊按鈕即可將文本添加到textedit中的簡單程序... 這裏有什麼不對嗎?使用QPushButton將文本添加到QTextEdit


#include&ltQPushButton> 
#include&ltQApplication> 
#include&ltQTextEdit> 
#include&ltQWidget> 
#include&ltQHBoxLayout> 
#include&ltQLabel> 

int main(int argc,char *argv[]) 
{ 
QApplication app(argc,argv); 
QHBoxLayout *layout=new QHBoxLayout; 
QTextEdit *text = new QTextEdit(); 
QWidget window; 
QPushButton *button; 

layout->addWidget(text); 
button = new QPushButton(); 
button->setText(QChar(i+48)); 

QObject::connect(button,SIGNAL(clicked()),text,SLOT(setPlainText("hai"))); 

layout->addWidget(button); 
window.setLayout(layout); 
window.resize(500, 500); 
window.show(); 

return app.exec(); 
}

回答

1

您不能像這樣使用connect。您無法將參數傳遞給SLOT,而這些參數不存在於連接的SIGNAL中。

您需要將clicked()信號連接到自己的插槽(不帶參數),並自己調用setPlainText函數(或發出具有QString參數一個新的信號)。

另一種選擇是使用QSignalMapper,如Signals and Slots高級用法部分所述。

+0

你可以給我一個功能,使這件事情工作? – user767060 2011-06-05 12:28:35

+0

您需要創建一個真實的類(從QObject派生或者一個小部件)來處理您的自定義槽,或者閱讀我爲QSignalMapper方法指出的文檔。所有這些在Qt文檔,示例和教程中都有很好的描述。 – Mat 2011-06-05 12:30:53

+0

謝謝,信號映射器解決了!但它說它只是一個較慢的代碼,告訴我是否有其他方法來實現它 – user767060 2011-06-05 18:27:55

0

我認爲這是行不通的,你不能在connect聲明中給出一個插槽默認參數。 SLOT宏實際上只是將其參數轉換爲字符串,並在text類的已註冊插槽列表中搜索插槽名稱。

你必須打電話給你自己的沒有參數的插槽,並手動調用setPlainText與預期的文本。也許Qt在這方面有一些幫手類,但你的解決方案不應該工作。

順便說一句,你真的試過這個,並得到一個錯誤,或者你只是在這裏發佈它,而不是簡單地嘗試一下嗎?

+0

當使用滑塊和線性編輯器時,任何一個對象的任何變化都會反映另一個對象,我直接在信號中使用valueChanged()函數將setValue()插入到插槽中。如果這樣做,爲什麼不這樣做,你可以簡單地解釋我如果可能? – user767060 2011-06-05 12:22:15

+0

我試過並製作了make文件並運行它。點擊沒有發生。而我剛剛剛開始使用Qt ....只是一個初學者.... – user767060 2011-06-05 12:27:57

+0

@ user767060因爲您已將'valueChanged()'信號的值傳送到'setValue()'插槽。但是這次你要求一個非參數信號將一個默認參數傳送給該插槽,這只是不起作用。您可以在connect方法中從信號中刪除參數,以便在調用插槽時丟棄信號的參數,但不能僅僅奇蹟般地生成默認參數。唯一的方法就是聲明槽(在類定義中)採用默認參數,但是當您更改QTextEdit的代碼時,在這裏不起作用。有關更多信息,請參閱Qt的信號/插槽文檔 – 2011-06-05 12:29:06

0

您的信號和插槽不兼容。 Qt爲此提供了doc。

嘗試訪問此page

在這裏它說, 「信號和插槽機制是類型安全的:信號的簽名必須匹配接收插槽的簽名(實際上插槽可能比它收到的信號更短的簽名它可以忽略額外的參數)由於簽名是兼容的,編譯器可以幫助我們檢測類型不匹配,信號和插槽是鬆耦合的:一個發出信號的類既不知道也不關心哪個插槽接收信號。信號插槽機制可以與函數調用進行比較(或歸結爲)。您正在發送信號的地方調用功能(插槽)。現在設想該函數需要一些參數,並且沒有默認值。但是你正試圖調用這個函數。會發生什麼?。這就是你的代碼中發生的事情。

相關問題