Qt不同类间传递变量方法总结

参考:http://blog.csdn.net/shangyaowei/article/details/17424673

最近开发一个程序,需要多个源文件,包括若干个头文件和若干个定义文件。因此如何在多个源程序间开发传递变量就成了一个关键问题。刚开始我通过构造函数传递参数,能成功传递但数据却不会自动更新。随后想到通过全局变量传递参数。一般来说在多个源程序间传递变量大概有两种方法,一是利用extern声明全局变量来进行传递,二是将全局变量定义成一个类的静态变量,通过类名::变量名进行调用。

通过若干次调试,两种方法都成功了,现将注意要点记录如下(注释部分为第二种方法):

本程序实现一个计数器,主窗口显示计数值(1s加1),点击按钮弹出子窗口,子窗口的lcd同步显示计数值。其中ui文件已用designer画好。
my_define.h文件:

#ifndef MY_DEFINE_H
#define MY_DEFINE_H
extern int aa;

#endif
my_define.cpp文件

 #include "my_define.h"
//int temp::aa=0;
int   aa=0; 
dialog.h 文件

#ifndef MYFORM_H
#define MYFORM_H
#include "dialog_base.h"
class MyForm : public MyFormBase
{ 
    Q_OBJECT
public:
    MyForm( QWidget* parent = 0, const char* name = 0,  WFlags fl = 0 );
    ~MyForm();
protected:
    virtual void form_1slot();
protected slots:
    virtual void mytime1();
};
#endif 
dialog.cpp文件

#include "dialog.h"
#include "f1.h"
//#include "my_define.h"
#include <qpushbutton.h>
#include <qstring.h>
#include <qtimer.h>
#include <qlineedit.h>
extern int aa;//全局变量声明
MyForm::MyForm( QWidget* parent,  const char* name, WFlags fl )
    : MyFormBase( parent, name, fl )
{    
      QTimer  *timer1=new QTimer(this);
      connect(timer1,SIGNAL(timeout()),this,SLOT(mytime1()));
       timer1->start(1000,0);
}
void MyForm::mytime1()
{      
     LineEdit1->setText(QString::number( aa++));
    // LineEdit1->setText(QString::number(temp::aa++));
}
void MyForm::form_1slot()
{   
    int bb=20; 
    Form1 *form1 = new Form1(bb);//通过构造函数传递参数bb
    form1->showFullScreen();
}
MyForm::~MyForm()
{
}
f1.h 文件

#ifndef FORM1_H
#define FORM1_H
#include "f1_base.h"
class Form1 : public ChildFormBase
{ 
    Q_OBJECT
public:
    Form1( int num=0,QWidget* parent = 0, const char* name = 0, WFlags fl = 0 );
     virtual ~Form1();
public slots:
    void closeForm1();
protected slots:
    virtual void display_slot();
};
#endif // FORM1_H
f1.cpp文件

#include "f1.h"
//#include "my_define.h"
#include <qpushbutton.h>
#include <qlcdnumber.h>
#include <qtimer.h>
extern int aa;
Form1::Form1( int num,QWidget* parent,  const char* name, WFlags fl ) 
    : ChildFormBase( parent, name, fl )
{ 
 QTimer  *flashtimer=new QTimer(this);
  connect(flashtimer,SIGNAL(timeout()),this,SLOT(display_slot()));
   flashtimer->start(500,0);
  LCDNumber2->display(num);//lcd2显示bb
  connect( BackMainButton , SIGNAL(clicked()) , this , SLOT(closeForm1()) );
}
void Form1::display_slot()
{
 LCDNumber1->display(aa);
// LCDNumber1->display(temp::aa);//lcd1实时显示aa
}
Form1::~Form1()
{
    // no need to delete child widgets, Qt does it all for us
}
void Form1::closeForm1()
{
  close();
}
main.cpp文件

#include "dialog.h"
#include <qtopia/qpeapplication.h>
QTOPIA_ADD_APPLICATION("dialog",MyForm)
QTOPIA_MAIN
dialog.pro文件

TEMPLATE = app
CONFIG  += qtopia warn_on release
HEADERS = dialog.h \
   my_define.h\
         f1.h           
SOURCES = dialog.cpp \
                 my_define.cpp\
             f1.cpp\
              main.cpp
INTERFACES = dialog_base.ui \
    f1_base.ui
TARGET         = dialog  
  • 8
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Qt不同之间变量传递方法有很多种。 一、使用信号与槽机制 在Qt,通过connect连接信号与槽,可以实现不同之间变量传递。例如,当一个变量改变时,可以通过emit发送一个信号,并在其他通过connect连接相应的槽函数,实现变量传递。这种方法尤其适合于不同之间的交互较少的情况。 二、使用全局变量 全局变量可以在程序的任何地方访问,因此可以通过定义全局变量,在需要访问的直接使用。但是,全局变量存在两个显著问题:一个是可读性问题,全局变量存在于整个程序,难以追踪;二是安全性问题,全局变量容易被误操作。 三、使用单例模式 单例模式是一种常用的设计模式,它可以保证一个只有一个实例,并提供一个全局的访问点。通过使用单例模式,不同可以通过调用单例的函数来获取需要的变量。这种方法比全局变量更安全,但也需要注意不要过度使用。 四、使用传参方式 当某个需要使用另一个变量时,可以将需要使用的变量通过传参的方式传递给该的函数,这种方式适用于变量的交互较为频繁的情况,但也需要注意过度传参可能会导致程序设计复杂化。 以上几种方法都可以实现不同之间变量传递,但使用时需要根据具体的情况选择合适的方法。 ### 回答2: 在Qt不同之间变量传递可以通过以下方式实现: 1. 使用信号和槽传递变量: 信号和槽是Qt的重要机制之一,它可以实现不同之间的通讯。在发送信号的定义一个信号,接收信号的定义一个槽函数,并将两者关联起来。在信号函数传递变量,槽函数接收变量即可实现变量传递。示例代码如下: //发送信号的 class Sender: public QObject { Q_OBJECT signals: void sendVar(int var); //定义一个带参数的信号 }; //接收信号的 class Receiver: public QObject { Q_OBJECT public slots: void receiveVar(int var); //定义一个带参数的槽函数 }; //在两个实现信号和槽的关联 connect(sender, &Sender::sendVar, receiver, &Receiver::receiveVar); 2. 使用全局变量传递变量: 全局变量可以在整个程序访问,因此可以用于不同之间变量传递。在定义全局变量的文件声明变量并实现其访问方法,其他可以直接调用该变量,并通过访问方法获取或修改变量的值。示例代码如下: //定义全局变量 extern int var; //声明访问方法 int getVar(); void setVar(int var); //在Sender获取和修改变量 int var = getVar(); setVar(var); //在Receiver获取和修改变量 int var = getVar(); setVar(var); 3. 使用构造函数和成员函数传递变量: 在创建一个的对象时,可以通过其构造函数传递变量,在其他创建该对象并调用其成员函数获取或修改变量的值。示例代码如下: //定义 class MyClass { public: MyClass(int var): m_var(var) {} //定义构造函数传递变量 int getVar() { return m_var; } //定义成员函数获取变量 void setVar(int var) { m_var = var; } //定义成员函数修改变量 private: int m_var; }; //在Sender创建对象并获取和修改变量 MyClass myClass(var); int var = myClass.getVar(); myClass.setVar(var); //在Receiver创建对象并获取和修改变量 MyClass myClass(var); int var = myClass.getVar(); myClass.setVar(var);

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值