Qt窗体之间相互传值3种方式—信号与槽、共有函数接口、全局变量

原文链接:

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

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

我在mainwindow里面添加了一个textedit用来接收传递过来的值,dialog里面添加了一个ok按钮和一个lineedit,可以在lineedit里面输入信息点击ok按钮时传递到主窗口。


dialog.h如下:

#ifndef DIALOG_H
#define DIALOG_H
 
#include 
 
namespace Ui {
class Dialog;
}
 
class Dialog : public QDialog
{
    Q_OBJECT
 
public:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();
 
private slots:
    void on_pushButton_clicked();
 
signals:
    void sendData(QString);   //用来传递数据的信号
 
private:
    Ui::Dialog *ui;
};
 
#endif // DIALOG_H



dialog.cpp如下:

#include "dialog.h"
#include "ui_dialog.h"
 
Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);
}
 
Dialog::~Dialog()
{
    delete ui;
}
 
void Dialog::on_pushButton_clicked()
{
    emit sendData(ui->lineEdit->text());  //获取lineEdit的输入并且传递出去
}
</span>



mainwindow.h如下:

#define MAINWINDOW_H
 
#include 
 
namespace Ui {
class MainWindow;
}
 
class MainWindow : public QMainWindow
{
    Q_OBJECT
 
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
 
private slots:
    void receiveData(QString data);   //接收传递过来的数据的槽
 
private:
    Ui::MainWindow *ui;
};
 
#endif // MAINWINDOW_H
</span>



main.cpp如下(不变):

#include 
 
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
 
    return a.exec();
}
</span>

最终的结果:

Qt窗体之间相互传值3种方式—信号与槽、共有函数接口、全局变量_第1张图片

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

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

  使用public函数接口的方式,要先确定是从父窗口向子窗口传值还是相反,前者的话可以在子窗口中创建一个public的方法来传递数据,在父窗口调用即可,后者的话正好相反,下面是父窗口向子窗口传值:

ainwindow.h如下:

    #ifndef MAINWINDOW_H 
    #define MAINWINDOW_H 
    #include  
    namespace Ui { 
    class MainWindow;
     } 
    class MainWindow : public QMainWindow 
    { Q_OBJECT 
    public: 
    explicit MainWindow(QWidget *parent = 0); 
    ~MainWindow(); 
    public: void sendData(QString data); //在子窗口创建public函数用来获取传递的数据 
    private: Ui::MainWindow *ui;
     };
     #endif // MAINWINDOW_H

mainwindow.cpp如下:
#include "mainwindow.h"
#include "ui_mainwindow.h" 
MainWindow::MainWindow(QWidget *parent) : 
         QMainWindow(parent), 
         ui(new Ui::MainWindow)
{ 
         ui->setupUi(this); 
} 
MainWindow::~MainWindow() 
{ 
        delete ui; 
} 
void MainWindow::sendData(QString data) 
{ 
        ui->textEdit->setText(data); //在textEdit中显示传递的数据
}
dialog.cpp如下:
#include "dialog.h" 
#include "ui_dialog.h" 
#include "mainwindow.h" 
Dialog::Dialog(QWidget *parent) :
        QDialog(parent),
        ui(new Ui::Dialog) 
{
        ui->setupUi(this); 
} 
Dialog::~Dialog() 
{ 
        delete ui; 
} 
void Dialog::on_pushButton_clicked() 
{ 
        MainWindow *w = new MainWindow;
        w->sendData(ui->lineEdit->text()); //直接调用public函数将本页面中lineEdit的数据传递过去 w->show(); 
 } 

这种传值方式比较适用于父子窗口之间的传值调用。

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

3.1使用extern关键字
在主界面上声明全局变量并为全局变量赋值,在子界面上声明外部变量即可:

dialog.cpp如下:

#include "dialog.h"
#include "ui_dialog.h" 
#include "mainwindow.h" 
QString globaldata; //声明一个全局变量用于窗体间传值 
Dialog::Dialog(QWidget *parent) : QDialog(parent), ui(new Ui::Dialog) 
{ 
	ui->setupUi(this); 
} 
Dialog::~Dialog() 
{ 
	delete ui; 
} 
void Dialog::on_pushButton_clicked() 
{ 
	globaldata = ui->lineEdit->text(); //获取lineEdit输入的值赋值给全局变量 MainWindow *w = new MainWindow; w->show(); 
} 


mainwindow.cpp如下:

#include "mainwindow.h" 
#include "ui_mainwindow.h" 
extern QString globaldata; //声明外部变量 
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) 
{ 
	ui->setupUi(this); 
	ui->textEdit->setText(globaldata); //对全局变量进行显示
 }
 MainWindow::~MainWindow() 
 { 
 	delete ui; 
 } 

以下为补充部分:
原文链接:

Qt中使用全局变量的两种方式

3.2使用static关键字

头文件声明:声明为public类型变量

mainwindow.h


   
   
   
   
  1. #ifndef MAINWINDOW_H
  2. #define MAINWINDOW_H
  3. #include
  4. namespace Ui {
  5. class MainWindow;
  6. }
  7. class MainWindow : public QMainWindow
  8. {
  9. Q_OBJECT
  10. public:
  11. explicit MainWindow(QWidget *parent = 0);
  12. ~MainWindow();
  13. static int a;
  14. static QString c;
  15. private:
  16. Ui::MainWindow *ui;
  17. };
  18. #endif // MAINWINDOW_H


Qt窗体之间相互传值3种方式—信号与槽、共有函数接口、全局变量_第2张图片

源文件定义:注意这里的变量定义,一定要写在函数的外面

mainwindow.cpp


   
   
   
   
  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3. #include
  4. #include
  5. #include //是包含QwtPointSeriesData类的头文件
  6. #include
  7. int MainWindow::a = 100;
  8. QString MainWindow::c = "clue";
  9. MainWindow::MainWindow(QWidget *parent) :
  10. QMainWindow(parent),
  11. ui( new Ui::MainWindow)
  12. {
  13. qDebug()<< "a="<< a;
  14. ui->textBrowser->setText(c);
  15. //..........................后面代码省略
Qt窗体之间相互传值3种方式—信号与槽、共有函数接口、全局变量_第3张图片

调用方式:在函数里面调用全局变量

Qt窗体之间相互传值3种方式—信号与槽、共有函数接口、全局变量_第4张图片

2、使用extern关键字:

cglobal.h  (声明写在类和命名控件的外面)

[cpp]  view plain  copy
  1. #ifndef CGLOBAL_H  
  2. #define CGLOBAL_H  
  3. extern int testValue;  
  4. #endif // CGLOBAL_H  

cglobal.cpp  (在函数外面定义变量)

[cpp]  view plain  copy
  1. #include "cglobal.h"  
  2.   
  3. int testValue=1;  

调用方式

[cpp]  view plain  copy
  1. #include "cglobal.h"  
  2. #include   
  3.   
  4. qDebug()<
  5. testValue=2;  
  6. qDebug()<
墙裂推荐第一种使用static关键字的全局变量,第二种会破坏封装性。




你可能感兴趣的:(Qt学习)