QT 使用全局变量的方法
轉載自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指針的額外開銷,因此靜態成員函數與類的全局函數相比速度上會有少許的增長;
調用靜態成員函數,可以用成員訪問操作符(.)和(->)為一個類的對象或指向類對象的指針調用靜態成員函數,也可以直接使用如下格式:
<類名>::<靜態成員函數名>(<參數表>)
調用類的靜態成員函數。
總結
以上是生活随笔為你收集整理的QT 使用全局变量的方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: QT窗体控件自适应大小
- 下一篇: QT,QVector 基本用法,遍历[实