代码编织梦想

兩種方法:

第一:使用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; 
这样就可以当全局变量使用了,

以下为转来的实例

qt中的全局变量_xiehuin的博客-CSDN博客

这一段开发一个程序,需要多个源文件,包括若干个头文件和若干个定义文件。因此如何在多个源程序间开发传递变量就成了一个关键问题。一般来说在多个源程序间传递变量大概有两种方法,一是利用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指针的额外开销,因此静态成员函数与类的全局函数相比速度上会有少许的增长;
  调用静态成员函数,可以用成员访问操作符(.)和(->)为一个类的对象或指向类对象的指针调用静态成员函数,也可以直接使用如下格式:
  <类名>::<静态成员函数名>(<参数表>)
  调用类的静态成员函数。

qt 使用全局变量的方法-爱代码爱编程

转载自http://blog.csdn.net/xiehuin/article/details/2087235 http://blog.csdn.net/liang890319/article/details/7062928 兩種方法: 第一:使用extern關鍵字聲明(不推薦,破壞了封裝性) 第二:新建一個類,存放全局的變量,函數   第一

QT 定义使用全局变量的方法-爱代码爱编程

1、跟C、C++那样用extern 2、新建一个类,存放全局的变量(使用全局变量这里举例就是第二种方法) 定义 student.h #ifndef STUDENT_H #define STUDENT_H #include <QString> /* 新建类 学生信息 */ class Student { public: Stud

qt文件怎么设置全局变量_QT编程之——使用全局变量-爱代码爱编程

在Qt中使用全局变量的实例 1.首先须要在一个头文件里对全局了变量使用exern方法进行定义。 //g.h extern char *testStr; 2.仅仅能在cpp文件里对事实上例化,而且实例化仅仅能在函数的外部进行。建议在包括main函数的cpp文件里进行实例化,这样能够确保在其它文件里使用时。它已经被实例化。 //a.h #inc

qt文件怎么设置全局变量_QT全局变量的调用-爱代码爱编程

1、使用static关键字: 头文件声明:声明为public类型变量 mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H #include namespace Ui { class MainWindow; } class MainWindow : public QMainWi

qt文件怎么设置全局变量_QT中全局变量的定义和使用-爱代码爱编程

多的就不说了,本来就是一个简单地内容,只是不会的话会很头疼 我们首先新建两个文件,文件名可以自定义,我们在这里定义为variate.h 和 variate.cpp 当然了,后缀是不能变的。 和函数一样,我们在variate.h中对全局变量进行声明,注意,extern 是不能遗漏的 1 2 3 4 5 #ifndef VARIATE_H

Qt中全局变量的使用-爱代码爱编程

一般在项目中想要定义一个变量可以被多个类进行访问,此时就可以定义全局变量。习惯上会将项目中所有类都用到的变量,集中定义在一个头文件中,使用时只需包含此头文件。但是对于我这样基础不牢靠的人,就犯了一个错误,而且当时怎么也没找到原因。 最后在别人的帮助下,得以解决。现记录一下。 #ifndef DATASET_H #define DATASET_H #in

QT 使用全局变量-爱代码爱编程

QT 使用全局变量共有两种方法(次贴讲的是写“全局类”的方法): 1.使用“static”关键字,将数据保存到数据区中 2.使用“extern”关键字 一、static 在“MainWindow .h”文件中声明变量变量和方法 #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWi

linux qt 动态库全局变量,QT窗体间传值之全局变量-爱代码爱编程

上一次的文章讲到了使用Signal&Slot机制进行窗体间数据的传递(见http://www.linuxidc.com/Linux/2014-03/98899.htm)。这里介绍另一种方式全局变量进行传值,在上一次的界面中的mainWindow和dialog中分别加入一个Label和LineEdit以及一个pushbutton。效果如:

c++&qt 多线程调用全局变量_撒欢打滚的人儿的博客-爱代码爱编程_qt 全局变量 多线程

C++&QT 多线程调用全局变量的解决方案:互斥锁QMutex、信号量QSemaphore 在多线程运行中,各个线程之间难免会对同一个变量进行操作。假设线程thread_A和线程thread_B都会用到全局变量gl