QT窗體間傳值總結
在寫程式時,難免會碰到多窗體之間進行傳值的問題。依照自己的理解,我把多窗體傳值的可以使用的方法歸納如下:
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
void on_buttonBox_accepted();用於相應確定按鈕的click事件。下面就是需要在該函式中產生一個訊號。程式碼如下:
- void Dialog::on_buttonBox_accepted()
- {
- emit sendData(ui->lineEdit->text());
- }
- 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();
- }
這裡,可能還有一個問題就是,父視窗如何給子視窗傳值,一方面,仍然可以使用訊號和槽的方式進行,但是,我感覺更便利的方式倒是使用這種public介面的方式進行傳值。這種來的更直接和明顯。當然,可以看出Signal&Signal方式進行此類的處理會更有通用性。
在receiveData(QString)的槽函式中進行接收到資料的處理,這裡僅僅進行了簡單的顯示:
- void MainWindow::receiveData(QString data)
- {
- ui->textEdit->setText(data);
- }
最後看下結果:
最終的結果,因為訊號和槽可以是多對多的,所以,在類似多個窗體廣播資訊時,這種方式就很有用,當然也可以使用全域性變數的形式。
這裡介紹另一種方式全域性變數進行傳值,在上一次的介面中的mainWindow和dialog中分別加入一個Label和LineEdit以及一個pushbutton。效果如:
執行方式為在主介面mainWindow中單擊全域性變數按鈕對全域性變數進行賦值,賦值完成後,在Dialog中單擊全域性變數在LineEdit中顯示全域性變數的值,可以發現這種方式下可以很容易的反轉傳遞內容。
具體實現為:
在mainWindow.cpp檔案中加入:
- QString globaldata; //宣告一個全域性變數用於窗體間傳值
- void MainWindow::on_globalpb_clicked()
- {
- globaldata = ui->lineEdit->text();
- }
- extern QString globaldata;
- void Dialog::on_pushButton_clicked()
- {
- ui->lineEdit_2->setText(globaldata);
- }
為了節省篇幅,這裡不將最後的結果上傳上來了, 下一博文,將介紹窗體間傳值的另一種方式:public函式介面方式。
這裡介紹另一種,使用public函式介面的方式,這裡就牽扯到兩個方向間的傳值,父到子以及子到父視窗,通過這種方式都很容易做到,如子到父,可以在子窗體中實現一個public方法如prepareDoingData(&data),將需要處理的data的引用傳遞到子窗體,子窗體中可以對其進行操作,這裡展示父到子的傳值:
在Dialog介面中增加一個TextEdit用於顯示最終傳遞的內容,並增加一個公有的方法:
- public:
- void setTextEditData(QString data);
- void Dialog::setTextEditData(QString data)
- {
- ui->textEdit->setText(data);
- }
上面部分是在標頭檔案中的內容,下面為在.cpp中的內容,而在mainwindow.cpp中只需要進行呼叫即可:
- dlg->setTextEditData(QString("我來測試公有介面方式傳值!"));