在寫程序時,難免會碰到多窗體之間進行傳值的問題。依照自己的理解,我把多窗體傳值的可以使用的方法歸納如下: 1.使用QT中的Signal&Slot機制進行傳值; 2.使用全局變量; 3.使用public形式的函數接口; 4.使用QT中的Event機制(這種沒有把握,但是感覺應該是可以的),但是實現起來應該比前幾種復雜,這里不做討論。 下面分別進行討論: 1.使用QT中的Signal&Slot機制進行傳值: QT中的Signal&Slot機制相比於MFC中的消息機制簡單了許多,它保證了任何對象之間均可以通過這種方式進行通信,甚至可以得到消息的sender。這里就拿一個簡單的窗體間傳值作為例子。 首先看一下主窗體MainWindow: 在設計器中拖拽一個Label和一個TextEdit控件到界面上,TextEdit用於顯示傳遞過來的數據。
創建一個右下有兩個按鍵的對話框,放置一個Label和一個LineEdit。
下面就是編碼的操作了,我們需要在Dialog中聲明一個信號,當用戶點擊OK時傳遞LineEdit中的內容到mainWindow中,具體的dialog.h代碼為:
#ifndef DIALOG_H #define DIALOG_H #include <QDialog> namespace Ui { class Dialog; } class Dialog : public QDialog { Q_OBJECT public: explicit Dialog(QWidget *parent = 0); ~Dialog(); private: Ui::Dialog *ui; signals: void sendData(QString); private slots: void on_buttonBox_accepted(); }; #endif // DIALOG_H
其中的signals:void sendData(QString)便是我們需要的信號函數,同時聲明了一個槽函數 void on_buttonBox_accepted();用於相應確定按鈕的click事件。下面就是需要在該函數中產生一個信號。代碼如下: void Dialog::on_buttonBox_accepted() { emit sendData(ui->lineEdit->text()); } 代碼異乎尋常的簡單,只需要用emit的方式調用sendData函數,將需要的參數傳遞進去即可。而MainWindow中則需要聲明接收的槽函數,注意槽函數參數只能與信號函數少或相等,而不能多於信號函數參數個數。在MainWindow的頭文件中聲明槽函數: private slots: void receiveData(QString data); 為了便於測試,我只在MainWindow的構造函數中創建了一個Dialog對象,並連接了信號和槽,具體為: MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); //信號槽方式下父子窗體傳值的測試 Dialog *dlg = new Dialog; //關聯信號和槽函數 connect(dlg,SIGNAL(sendData(QString)),this,SLOT(receiveData(QString))); // dlg->setModal(true); 不論是模態或者非模態都可以正常傳值 dlg->show(); } 這里,我沒有將父窗口的指針傳遞到Dialog中,如new Dialog(this),這種方式下,實際上可以歸結到第三類傳值方式中去。因為此時,可以使用MainWindow中的父窗口的函數進行數據的賦值和操作。 這里,可能還有一個問題就是,父窗口如何給子窗口傳值,一方面,仍然可以使用信號和槽的方式進行,但是,我感覺更便利的方式倒是使用這種public接口的方式進行傳值。這種來的更直接和明顯。當然,可以看出Signal&Signal方式進行此類的處理會更有通用性。 在receiveData(QString)的槽函數中進行接收到數據的處理,這里僅僅進行了簡單的顯示: void MainWindow::receiveData(QString data) { ui->textEdit->setText(data); }
最后看下結果:
最終的結果,因為信號和槽可以是多對多的,所以,在類似多個窗體廣播信息時,這種方式就很有用,當然也可以使用全局變量的形式。