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

原文链接:

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

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

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


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 slots:
    void on_pushButton_clicked();
 
signals:
    void sendData(QString);   //用来传递数据的信号
 
private:
    Ui::Dialog *ui;
};
 
#endif // DIALOG_H</span>



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 <QMainWindow>
 
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 <QApplication>
 
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
 
    return a.exec();
}
</span>

最终的结果:

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

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

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

ainwindow.h如下:

    #ifndef MAINWINDOW_H 
    #define MAINWINDOW_H 
    #include <QMainWindow> 
    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 <QMainWindow>
  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



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

mainwindow.cpp


 
 
  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3. #include <QtMath>
  4. #include <qwt_plot.h>
  5. #include <qwt_plot_curve.h> //是包含QwtPointSeriesData类的头文件
  6. #include <qwt_plot_grid.h>
  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. //..........................后面代码省略

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


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 <QDebug>  
  3.   
  4. qDebug()<<testValue;  
  5. testValue=2;  
  6. qDebug()<<testValue;  
墙裂推荐第一种使用static关键字的全局变量,第二种会破坏封装性。




  • 7
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值