日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

QT 使用全局变量的方法

發布時間:2025/4/5 c/c++ 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 使用全局变量的方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。