QT 使用全局变量的方法

转载 2015年11月18日 21:32:07

转载自http://blog.csdn.net/xiehuin/article/details/2087235

http://blog.csdn.net/liang890319/article/details/7062928

兩種方法:

第一:使用extern關鍵字聲明(不推薦,破壞了封裝性)
第二:新建一個類,存放全局的變量,函數


 


第一:使用extern關鍵字聲明(不推薦,破壞了封裝性)

在一个头文件中声明int var_name全局变量,在另一个cpp文件中引用此变量: extern int var_name;
指出var_name是在外部文件定时的变量,编译器会自动在所有文件中查找var_name的定义,如:
aaa.h:

#ifndef AAA_H
#define AAA_H
int var_name;

static bool fun()

{

dosth

}
#endif // AAA_H

main.cpp:

#include <QtCore/QCoreApplication>
#include "aaa.h"
#include <qdebug.h>
extern int var_name;//只需导入即可,不可再定义,函數可用也可不用extren聲明
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

if (!dun()) 

return 1;
    qDebug()<<var_name;//全局整形变量会赋默认值0
    return a.exec();
}

第二:新建一個類,存放全局的變量,函數(static关键字)

在.h文件下定义类 
class   temp{ 
private: 
         static  int   x; 

在.cpp下定义 
int   temp::x=0; 
这样就可以当全局变量使用了,

以下为转来的实例

http://blog.csdn.net/xiehuin/article/details/2087235

这一段开发一个程序,需要多个源文件,包括若干个头文件和若干个定义文件。因此如何在多个源程序间开发传递变量就成了一个关键问题。一般来说在多个源程序间传递变量大概有两种方法,一是利用extern声明全局变量来进行传递,二是将全局变量定义成一个类的静态变量,通过类名::变量名进行调用。

通过若干次调试,第一种方法终于成功,现将注意要点记录如下:

WILD.H文件:

 #ifndef FORM1_H
#define FORM1_H

/*class wild
{
  public:
    static int sum;    //推荐
};*/

extern int num;   //不推荐

#endif

WILD.CPP文件:

#include "wild.h"

//wild::sum=10;   //推荐
int num=10;  //不推荐

FORM1.H文件:

/****************************************************************************
** Form interface generated from reading ui file 'form1.ui'
**
** Created: 六  2月 9 11:13:23 2008
**      by: The User Interface Compiler ($Id: qt/main.cpp   3.1.1   edited Nov 21 17:40 $)
**
** WARNING! All changes made in this file will be lost!
****************************************************************************/

#ifndef FORM1_H
#define FORM1_H

#include <qvariant.h>
#include <qwidget.h>
//#include "wild.h"

class QVBoxLayout;
class QHBoxLayout;
class QGridLayout;
class QLineEdit;
class QPushButton;
//class wild;

class Form1 : public QWidget
{
    Q_OBJECT

public:
    Form1( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 );
    ~Form1();

    QLineEdit* lineEdit1;
    QPushButton* pushButton1;

protected:
     
protected slots:
    virtual void languageChange();
    virtual void sett();
};

#endif // FORM1_H

FORM1.CPP文件:

/****************************************************************************
** Form implementation generated from reading ui file 'form1.ui'
**
** Created: 六  2月 9 11:13:35 2008
**      by: The User Interface Compiler ($Id: qt/main.cpp   3.1.1   edited Nov 21 17:40 $)
**
** WARNING! All changes made in this file will be lost!
****************************************************************************/

#include "form1.h"
//#include "wild.h"

#include <qvariant.h>
#include <qlineedit.h>
#include <qpushbutton.h>
#include <qlayout.h>
#include <qtooltip.h>
#include <qwhatsthis.h>
#include <qimage.h>
#include <qpixmap.h>
#include <iostream.h>

 extern int num;    //不推荐

/* 
 *  Constructs a Form1 as a child of 'parent', with the 
 *  name 'name' and widget flags set to 'f'.
 */
Form1::Form1( QWidget* parent, const char* name, WFlags fl )
    : QWidget( parent, name, fl )
{
    if ( !name )
 setName( "Form1" );

    lineEdit1 = new QLineEdit( this, "lineEdit1" );
    lineEdit1->setGeometry( QRect( 50, 80, 191, 61 ) );

    pushButton1 = new QPushButton( this, "pushButton1" );
    pushButton1->setGeometry( QRect( 60, 190, 161, 71 ) );
    languageChange();
    resize( QSize(600, 480).expandedTo(minimumSizeHint()) );

    // signals and slots connections
    connect( pushButton1, SIGNAL( clicked() ), this, SLOT( sett() ) );
    connect( pushButton1, SIGNAL( clicked() ), this, SLOT( adjustSize() ) );
}

/*
 *  Destroys the object and frees any allocated resources
 */
Form1::~Form1()
{
    // no need to delete child widgets, Qt does it all for us
}

/*
 *  Sets the strings of the subwidgets using the current
 *  language.
 */
void Form1::languageChange()
{
    setCaption( tr( "Form1" ) );
    pushButton1->setText( tr( "pushButton1" ) );
}

void Form1::sett()
{
    //lineEdit1->setText(
wild::sum);
 
    cout <<num;
}

MAIN文件:

#include <qapplication.h>
#include "form1.h"

int main( int argc, char ** argv )
{
    QApplication a( argc, argv );
    Form1 w;
    w.show();
    a.connect( &a, SIGNAL( lastWindowClosed() ), &a, SLOT( quit() ) );
    return a.exec();
}

要注意以下几点:

(1)头文件中声明全局变量时要加上extern关键字,全局变量的定义可以直接加在头文件中,也可以放到定义文件中,但在定义文件中的时候要注意加上变量类型符。

(2)调用全局变量的源文件可以不用包含全局变量所在的头文件,但最好是加上,因为几个文件间的相互包含makefile都给解决了。

(3)使用全局变量的时候需先声明,如extern int num;将其放在本文件的头文件的前面。(不推荐)

以上就是使用extern来解决全局变量的问题,但是这种方法有弊端,主要是如果在系统库函数中有和定义的全局变量同名的变量,将会造成冲突,其二是其结构不符合面向对象的思想,因此还是使用第二种方法为好。

實例2

//globalsize.h
#ifndef GLOBALSIZE_H
#define GLOBALSIZE_H
#include <QtGui>


class GlobalSize
{
public:
    static QSize size;


    static void setSize(QSize s);
    static QSize getSize();


};


#endif // GLOBALSIZE_H


//globalsize.cpp
#include "globalsize.h"


QSize GlobalSize::size = QSize(0,0);




void GlobalSize::setSize(QSize s)
{
    size = s;
}
QSize GlobalSize::getSize()
{
    return size;
}

辅助知识

面向对象的static关键字(类中的static关键字)
静态数据成员有以下特点:
  对于非静态数据成员,每个类对象都有自己的拷贝。而静态数据成员被当作是类的成员。无论这个类的对象被定义了多少个,静态数据成员在程序中也只有一份 拷 贝,由该类型的所有对象共享访问。也就是说,静态数据成员是该类的所有对象所共有的。对该类的多个对象来说,静态数据成员只分配一次内存,供所有对象共 用。所以,静态数据成员的值对每个对象都是一样的,它的值可以更新;
  静态数据成员存储在全局数据区。静态数据成员定义时要分配空间,所以不能在类声明中定义。语句int Myclass::Sum=0;是定义静态数据成员
  静态数据成员和普通数据成员一样遵从public,protected,private访问规则;
  因为静态数据成员在全局数据区分配内存,属于本类的所有对象共享,所以,它不属于特定的类对象,在没有产生类对象时其作用域就可见,即在没有产生类的实例时,我们就可以操作它;
  静态数据成员初始化与一般数据成员初始化不同。静态数据成员初始化的格式为:
  <数据类型><类名>::<静态数据成员名>=<值>
  类的静态数据成员有两种访问形式:
  <类对象名>.<静态数据成员名> 或 <类类型名>::<静态数据成员名>
  如果静态数据成员的访问权限允许的话(即public的成员),可在程序中,按上述格式来引用静态数据成员 ;
  静态数据成员主要用在各个对象都有相同的某项属性的时候。比如对于一个存款类,每个实例的利息都是相同的。所以,应该把利息设为存款类的静态数据成 员。这 有两个好处,第一,不管定义多少个存款类对象,利息数据成员都共享分配在全局数据区的内存,所以节省存储空间。第二,一旦利息需要改变时,只要改变一次, 则所有存款类对象的利息全改变过来了;
  同全局变量相比,使用静态数据成员有两个优势:
  静态数据成员没有进入程序的全局名字空间,因此不存在与程序中其它全局名字冲突的可能性;
  可以实现信息隐藏。静态数据成员可以是private成员,而全局变量不能;
  2、静态成员函数
  与静态数据成员一样,我们也可以创建一个静态成员函数,它为类的全部服务而不是为某一个类的具体对象服务。静态成员函数与静态数据成员一样,都是类的 内部 实现,属于类定义的一部分。 普通的成员函数一般都隐含了一个this指针,this指针指向类的对象本身,因为普通成员函数总是具体的属于某个类的具体对象的。通常情况下,this 是缺省的。如函数fn()实际上是this->fn()。但是与普通函数相比,静态成员函数由于不是与任何的对象相联系,因此它不具有this指 针。从这个意义上讲,它无法访问属于类对象的非静态数据成员,也无法访问非静态成员函数,它只能调用其余的静态成员函数。
关于静态成员函数,可以总结为以下几点:
  出现在类体外的函数定义不能指定关键字static;
  静态成员之间可以相互访问,包括静态成员函数访问静态数据成员和访问静态成员函数;
  非静态成员函数可以任意地访问静态成员函数和静态数据成员;
  静态成员函数不能访问非静态成员函数和非静态数据成员;
  由于没有this指针的额外开销,因此静态成员函数与类的全局函数相比速度上会有少许的增长;
  调用静态成员函数,可以用成员访问操作符(.)和(->)为一个类的对象或指向类对象的指针调用静态成员函数,也可以直接使用如下格式:
  <类名>::<静态成员函数名>(<参数表>)
  调用类的静态成员函数。

相关文章推荐

extern使用方法总结!

Extern的问题在于不知道这个关键词出现的时候到底是声明还是定义。 谨记:声明可以多次,定义只能一次。   函数的声明extern关键词是可有可无的,因为函数本身不加修饰的话就是extern的。但是...
  • CSDNwei
  • CSDNwei
  • 2016年07月06日 08:45
  • 6328

qt中的全局变量

这一段开发一个程序,需要多个源文件,包括若干个头文件和若干个定义文件。因此如何在多个源程序间开发传递变量就成了一个关键问题。一般来说在多个源程序间传递变量大概有两种方法,一是利用extern声明全局变...
  • xiehuin
  • xiehuin
  • 2008年02月09日 17:17
  • 12630

QT编程之——使用全局变量

在Qt中使用全局变量的实例 1.首先需要在一个头文件中对全局了变量使用exern方法进行定义。 //g.h extern char *testStr; 2.只能在cpp文件中对其是实例化,并且实例化...

Qt 对象数据的声明和使用

Qt 库对象数据的声明和使用 作者: Venus  C++程序编译效率 每个C++类的写法通常情况下: class A { public:     void something(); ...

QT窗体间传值之全局变量

上一次的文章讲到了使用Signal&Slot机制进行窗体间数据的传递。这里介绍另一种方式全局变量进行传值,在上一次的界面中的mainWindow和dialog中分别加入一个Label和LineEdit...

定义结构体全局变量的方法

一,在一个单文档项目里,首先在stdafx.h头文件中定义结构体类型.然后在类外定义此结构体变量.然后在其它使用此结构体变量的地方用extern声明此全局变量 二. 在一个单文档项目里,首先在s...

QT 全局变量

转载自http://blog.csdn.net/xiehuin/article/details/2087235 http://blog.csdn.net/liang890319/article/de...

Qt C++定义全局变量的两种方式

一、使用extern关键字 cglobal.h #ifndef CGLOBAL_H #define CGLOBAL_H extern int testValue; #endif // CGLOBA...

Qt:用 __thread 关键字让每个线程有自己的全局变量

在GUN标准中,提供了__thread关键字,配合static后,可以实现让一个线程拥有自己的专属变量。我对__thread进行了简单的封装,可以用于存储class。并且防止了内存泄露(如果使用Qt线...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:QT 使用全局变量的方法
举报原因:
原因补充:

(最多只允许输入30个字)