2017年12月24日 星期日

Qt--窗体之间相互传值的三种方式

1.使用QT中的Signal&Slot机制进行传值

我在mainwindow里面添加了一个textedit用来接收传递过来的值,dialog里面添加了一个ok按钮和一个lineedit,可以在lineedit里面输入信息点击ok按钮时传递到主窗口。
dialog.h如下:
[html] view plain copy
  1. <span style="font-family:Microsoft YaHei;font-size:12px;">#ifndef DIALOG_H  
  2. #define DIALOG_H  
  3.   
  4. #include <QDialog>  
  5.   
  6. namespace Ui {  
  7. class Dialog;  
  8. }  
  9.   
  10. class Dialog : public QDialog  
  11. {  
  12.     Q_OBJECT  
  13.   
  14. public:  
  15.     explicit Dialog(QWidget *parent = 0);  
  16.     ~Dialog();  
  17.   
  18. private slots:  
  19.     void on_pushButton_clicked();  
  20.   
  21. signals:  
  22.     void sendData(QString);   //用来传递数据的信号  
  23.   
  24. private:  
  25.     Ui::Dialog *ui;  
  26. };  
  27.   
  28. #endif // DIALOG_H</span>  

dialog.cpp如下:
[html] view plain copy
  1. <span style="font-family:Microsoft YaHei;font-size:12px;">#include "dialog.h"  
  2. #include "ui_dialog.h"  
  3.   
  4. Dialog::Dialog(QWidget *parent) :  
  5.     QDialog(parent),  
  6.     ui(new Ui::Dialog)  
  7. {  
  8.     ui->setupUi(this);  
  9. }  
  10.   
  11. Dialog::~Dialog()  
  12. {  
  13.     delete ui;  
  14. }  
  15.   
  16. void Dialog::on_pushButton_clicked()  
  17. {  
  18.     emit sendData(ui->lineEdit->text());  //获取lineEdit的输入并且传递出去  
  19. }  
  20. </span>  

mainwindow.h如下:
[html] view plain copy
  1. <span style="font-family:Microsoft YaHei;font-size:12px;">#ifndef MAINWINDOW_H  
  2. #define MAINWINDOW_H  
  3.   
  4. #include <QMainWindow>  
  5.   
  6. namespace Ui {  
  7. class MainWindow;  
  8. }  
  9.   
  10. class MainWindow : public QMainWindow  
  11. {  
  12.     Q_OBJECT  
  13.   
  14. public:  
  15.     explicit MainWindow(QWidget *parent = 0);  
  16.     ~MainWindow();  
  17.   
  18. private slots:  
  19.     void receiveData(QString data);   //接收传递过来的数据的槽  
  20.   
  21. private:  
  22.     Ui::MainWindow *ui;  
  23. };  
  24.   
  25. #endif // MAINWINDOW_H  
  26. </span>  
mainwindow.cpp如下:
[html] view plain copy
  1. <span style="font-family:Microsoft YaHei;font-size:12px;">#include "mainwindow.h"  
  2. #include "ui_mainwindow.h"  
  3. #include "dialog.h"  
  4.   
  5. MainWindow::MainWindow(QWidget *parent) :  
  6.     QMainWindow(parent),  
  7.     ui(new Ui::MainWindow)  
  8. {  
  9.     ui->setupUi(this);  
  10.   
  11.     Dialog *dlg = new Dialog;  
  12.     //关联信号和槽函数  
  13.     connect(dlg, SIGNAL(sendData(QString)), this, SLOT(receiveData(QString)));  
  14.     dlg->show();  
  15. }  
  16.   
  17. MainWindow::~MainWindow()  
  18. {  
  19.     delete ui;  
  20. }  
  21.   
  22. void MainWindow::receiveData(QString data)  
  23. {  
  24.     ui->textEdit->setText(data);     //获取传递过来的数据  
  25. }  
  26. </span>  

main.cpp如下:
[html] view plain copy
  1. <span style="font-family:Microsoft YaHei;font-size:12px;">#include "mainwindow.h"  
  2. #include <QApplication>  
  3.   
  4. int main(int argc, char *argv[])  
  5. {  
  6.     QApplication a(argc, argv);  
  7.     MainWindow w;  
  8.     w.show();  
  9.   
  10.     return a.exec();  
  11. }  
  12. </span>  

最终的结果:
因为信号和槽可以是多对多的,所以,在类似多个窗体广播信息时,这种方式就很有用。

2.使用public形式的函数接口进行传值


 使用public函数接口的方式,要先确定是从父窗口向子窗口传值还是相反,前者的话可以在子窗口中创建一个public的方法来传递数据,在父窗口调用即可,后者的话正好相反,下面是父窗口向子窗口传值:
mainwindow.h如下:
[html] view plain copy
  1. #ifndef MAINWINDOW_H  
  2. #define MAINWINDOW_H  
  3.   
  4. #include <QMainWindow>  
  5.   
  6. namespace Ui {  
  7. class MainWindow;  
  8. }  
  9.   
  10. class MainWindow : public QMainWindow  
  11. {  
  12.     Q_OBJECT  
  13.   
  14. public:  
  15.     explicit MainWindow(QWidget *parent = 0);  
  16.     ~MainWindow();  
  17.   
  18. public:  
  19.     void sendData(QString data);    //在子窗口创建public函数用来获取传递的数据  
  20.   
  21. private:  
  22.     Ui::MainWindow *ui;  
  23. };  
  24.   
  25. #endif // MAINWINDOW_H  
mainwindow.cpp如下:
[html] view plain copy
  1. #include "mainwindow.h"  
  2. #include "ui_mainwindow.h"  
  3.   
  4. MainWindow::MainWindow(QWidget *parent) :  
  5.     QMainWindow(parent),  
  6.     ui(new Ui::MainWindow)  
  7. {  
  8.     ui->setupUi(this);  
  9. }  
  10.   
  11. MainWindow::~MainWindow()  
  12. {  
  13.     delete ui;  
  14. }  
  15.   
  16. void MainWindow::sendData(QString data)  
  17. {  
  18.     ui->textEdit->setText(data);      //在textEdit中显示传递的数据  
  19. }  
dialog.cpp如下:
[html] view plain copy
  1. #include "dialog.h"  
  2. #include "ui_dialog.h"  
  3. #include "mainwindow.h"  
  4.   
  5. Dialog::Dialog(QWidget *parent) :  
  6.     QDialog(parent),  
  7.     ui(new Ui::Dialog)  
  8. {  
  9.     ui->setupUi(this);  
  10. }  
  11.   
  12. Dialog::~Dialog()  
  13. {  
  14.     delete ui;  
  15. }  
  16.   
  17. void Dialog::on_pushButton_clicked()  
  18. {  
  19.     MainWindow *w = new MainWindow;  
  20.     w->sendData(ui->lineEdit->text());    //直接调用public函数将本页面中lineEdit的数据传递过去  
  21.     w->show();  
  22. }  
main.cpp如下:
[html] view plain copy
  1. //#include "mainwindow.h"  
  2. #include "dialog.h"  
  3. #include <QApplication>  
  4.   
  5. int main(int argc, char *argv[])  
  6. {  
  7.     QApplication a(argc, argv);  
  8.     Dialog w;  
  9.     w.show();  
  10.   
  11.     return a.exec();  
  12. }  
这种传值方式比较适用于父子窗口之间的传值调用。

3.使用全局变量进行传值

 在主界面上声明全局变量并为全局变量赋值,在子界面上声明外部变量即可:
dialog.cpp如下:
[html] view plain copy
  1. #include "dialog.h"  
  2. #include "ui_dialog.h"  
  3. #include "mainwindow.h"  
  4.   
  5. QString globaldata;      //声明一个全局变量用于窗体间传值  
  6.   
  7. Dialog::Dialog(QWidget *parent) :  
  8.     QDialog(parent),  
  9.     ui(new Ui::Dialog)  
  10. {  
  11.     ui->setupUi(this);  
  12. }  
  13.   
  14. Dialog::~Dialog()  
  15. {  
  16.     delete ui;  
  17. }  
  18.   
  19. void Dialog::on_pushButton_clicked()  
  20. {  
  21.     globaldata = ui->lineEdit->text();      //获取lineEdit输入的值赋值给全局变量  
  22.     MainWindow *w = new MainWindow;  
  23.     w->show();  
  24. }  
mainwindow.cpp如下:
[html] view plain copy
  1. #include "mainwindow.h"  
  2. #include "ui_mainwindow.h"  
  3.   
  4. extern QString globaldata;      //声明外部变量  
  5.   
  6. MainWindow::MainWindow(QWidget *parent) :  
  7.     QMainWindow(parent),  
  8.     ui(new Ui::MainWindow)  
  9. {  
  10.     ui->setupUi(this);  
  11.     ui->textEdit->setText(globaldata);       //对全局变量进行显示  
  12. }  
  13.   
  14. MainWindow::~MainWindow()  
  15. {  
  16.     delete ui;  
  17. }  
main.cpp如下:
[html] view plain copy
  1. //#include "mainwindow.h"  
  2. #include "dialog.h"  
  3. #include <QApplication>  
  4.   
  5. int main(int argc, char *argv[])  
  6. {  
  7.     QApplication a(argc, argv);  
  8.     Dialog w;  
  9.     w.show();  
  10.   
  11.     return a.exec();  
  12. }