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 使用全局变量的方法相关推荐
- python跨文件全局变量_Python 进程之间共享数据(全局变量)的方法
进程之间共享数据(数值型): import multiprocessing def func(num): num.value=10.78 #子进程改变数值的值,主进程跟着改变 if __name__= ...
- Python跨文件全局变量的方法
Python实现跨文件跨线程全局变量的方法 参考:https://www.cnblogs.com/rnckty/p/7722603.html 跨文件全局变量不能跨进程,进程之间是隔绝的,必须用进程间通 ...
- Qt Creator用户互动方法
Qt Creator用户互动方法 用户互动方法 基本互动方法 鼠标区域 重点范围 可轻弹 常规控制属性 按钮控制 按钮 延迟按钮 复选框 单选按钮 转变 圆形按钮 显示文字和图标 检查按钮 按钮信号 ...
- python进程共享全局变量 时延_Python 进程之间共享数据(全局变量)的方法
进程之间共享数据(数值型): import multiprocessing def func(num): num.value=10.78 #子进程改变数值的值,主进程跟着改变 if __name__= ...
- Qt程序打包发布方法(使用官方提供的windeployqt工具)
Qt程序打包发布方法(使用官方提供的windeployqt工具) 转自:http://tieba.baidu.com/p/3730103947?qq-pf-to=pcqq.group Qt 官方开发环 ...
- angular中如何定义全局变量_angularjs 设置全局变量的方法
angularjs 设置全局变量的3种方法 angularjs自身有二种,设置全局变量的方法,在加上js的设置全局变量的方法,总共有三种.要实现的功能是,在ng-app中定义的全局变量,在不同的ng- ...
- angular6 设置全局变量_Angularjs 设置全局变量的方法总结
AngularJS 设置全局变量的三种方法 angularjs自身有二种,设置全局变量的方法,在加上js的设置全局变量的方法,总共有三种.要实现的功能是,在ng-app中定义的全局变量,在不同的ng- ...
- Qt | QTableView的使用方法
Qt | QTableView的使用方法 QTableView的数据是基于model显示的,需要先建一个model,然后tableView通过setModel进行模型绑定,后续操作model就可以实现 ...
- Qt程序打包发布方法(使用官方提供的windeployqt工具) 转自:http://tieba.baidu.com/p/3730103947?qq-pf-to=pcqq.group Qt 官方
Qt程序打包发布方法(使用官方提供的windeployqt工具) 转自:http://tieba.baidu.com/p/3730103947?qq-pf-to=pcqq.group Qt 官方开发环 ...
最新文章
- Javascript模块化编程
- TypeScript基础入门 - 函数 - 简介
- cv2.bitwise_not(主要讲这个)
- 一个信道的数据传输速率为4kb/s,单向传播时延为30ms,如果使停止-等待协议的信道最大利用率达到80%,那么要求的数据帧长度至少为( )
- Linux中查看负载
- 造轮子是什么意思_聊聊在阿里工作一年的收获,什么是真正的技术能力?
- Linux笔记 rm -rf 嘻嘻
- [收藏]ASP数据库操作类(上)
- 《数据结构》二叉查找树
- C语言程序设计中十全十美,21世纪高校计算机应用技术系列规划教材 C语言程序设计-潭浩强主编 林小茶编著.pdf...
- ubuntu系统键盘鼠标失灵的修复方案
- Alios things学习——helloworld
- 什么是back annotation
- 超长干货!最全数据指标分析!
- 彩色模型RGB,HSI,HSV,CMYK区分
- 清默网络——IPV6的地址详解
- Python3 图片文字识别翻译——调用百度AI、百度翻译和有道翻译的API
- 灰色关联度矩阵——MATLAB在数学建模中的应用
- ap接口 php_cos-php-sdk-v5接口文档
- 334. 递增的三元子序列 increasingTriplet
热门文章
- 2021考研数学一李林4套卷整理
- IPv6扩展头部 (四) 分片头部 Fragment Header for IPv6
- java 3des解密过程_6. Java 加解密技术系列之 3DES
- hocon配置文件_GitHub - Himmelt/Hocon: Simple Hocon Configuration Library [轻量 Hocon 配置库]...
- python方向键映射_python交互界面无法使用方向键
- Linux权限中的大写s,Linux文件权限、用户、组、文本实操二
- stm32怎么加载字库_收藏 | STM32单片机超详细学习汇总资料(二)
- 将服务端移植到Linux和MAC OS
- C++标准库与STL简介
- 32位mysql安装包_《MySQL 入门教程》第 02 篇 MySQL 安装