歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

QT窗體間傳值總結之Signal&Slot

在寫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

其中的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);
}

最後看下結果:

最終的結果,因為信號和槽可以是多對多的,所以,在類似多個窗體廣播信息時,這種方式就很有用,當然也可以使用全局變量的形式。

 

Qt 的詳細介紹:請點這裡
Qt 的下載地址:請點這裡

Copyright © Linux教程網 All Rights Reserved