如何使用全局变量QT

2023-11-08

兩種方法:

第一:使用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指针的额外开销,因此静态成员函数与类的全局函数相比速度上会有少许的增长;
  调用静态成员函数,可以用成员访问操作符(.)和(->)为一个类的对象或指向类对象的指针调用静态成员函数,也可以直接使用如下格式:
  <类名>::<静态成员函数名>(<参数表>)
  调用类的静态成员函数。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用全局变量QT 的相关文章

  • 是否有可能劫持标准输出

    我正在尝试使用 C 重定向 Windows XP 上已运行进程的标准输出 我知道如果我自己生成进程 我可以做到这一点 但对于这个应用程序 我更喜欢一个 监听器 我可以附加到另一个进程 这在纯 Net 中可能吗 如果不可能 在 Win32 中
  • Caliburn.Micro - ShowDialog() 如何关闭对话框?

    EDIT 新信息 刚刚设法让记录器工作 老实说 我不知道 cm 有一个 并且在尝试使用时收到此消息TryClose TryClose requires a parent IConductor or a view with a Close m
  • ASP.NET Web 应用程序中的身份验证遇到问题

    我正在尝试对从登录页面登录我的 Web 应用程序的用户进行身份验证 我正在使用本教程 http support microsoft com kb 301240作为指南 它几乎准确地解释了我希望做什么 但是当我输入用户名和密码时 验证不起作用
  • STL之类的容器typedef快捷方式?

    STL 容器的常见模式是这样的 map
  • C# 无法捕获 SerializationException

    我的程序在加载序列化文件的部分遇到问题 如果文件无法反序列化 我希望很好地失败 但由于某种原因 我的程序将中断而不是进入 catch 子句 这是我的代码 using FileStream fs new FileStream openFile
  • ContentDialog 未与 UWP 中心对齐

    据我所知 ContentDialog的默认行为应该是使其在 PC 上居中并在移动设备上与顶部对齐 但就我而言 即使在 PC 上我也将其与顶部对齐 但我不明白发生了什么 我正在使用代码隐藏来创建它 这是我正在使用的代码片段 Creates t
  • 将 dataGridView 中选定的行作为对象检索

    我有一堂这样的课 public partial class AdressBokPerson public long Session get set public string F rnamn get set public string Ef
  • opencv中如何去除二值图像噪声?

    将图像转换为二值图像 黑白 后如果有任何噪音怎么办 我消除了那些不需要的噪音 您可以看到下图的黑色区域内有一些白噪声 我该如何去除噪声 使用opencv http img857 imageshack us img857 999 blackn
  • 如何将 Q 格式整数转换为浮点数(反之亦然)?

    我四处搜寻 找不到一个很好的问题来回答这个问题 给定一个整数 使用Q Format https en wikipedia org wiki Q number format 如何将该数字转换为普通浮点类型 反之亦然 如何将浮点类型转换为Q F
  • 在c#中获取没有时间的日期

    我的表上有一列 缺勤日期时间 日期 当我想要获取包含日期的行时 它返回 0 行 这是我的 C 代码 DateTime ClassDate DateTime Parse lblDate Content ToString var Abs dbs
  • 调用异步方法在视图模型的构造函数中加载数据有警告

    我的视图包含一个 ListView 它显示来自互联网的一些数据 我创建一个异步方法来加载数据并在我的视图模型的构造函数中调用该方法 它有一个警告提示我现在使用await关键字 还有其他解决方案可以在构造函数中异步加载数据吗 有几种可以应用的
  • 更改 Xamarin.Forms 应用中顶部栏和底部栏(ControlsBar、StatusBar)的颜色

    无论如何 即使后面需要特定于平台的代码 也可以更改顶部栏 蓝色的 和底部栏 黑色的 的颜色吗 我希望添加对浅色和深色模式的支持 因此我希望能够在运行时更改它 有可能的 Android Using Window SetStatusBarCol
  • 在 C# 中使用命名空间别名有什么好处? [复制]

    这个问题在这里已经有答案了 使用命名空间别名有什么好处 仅仅是为了简化编码吗 仅当与类发生冲突时我才使用名称空间别名 对我来说 这根本没有简化 我的意见是 如果没有必要 就不要使用
  • C#:自定义转换为值类型

    是否可以将自定义类转换为值类型 这是一个例子 var x new Foo var y int x Does not compile 是否有可能实现上述情况 我需要超载一些东西吗Foo 您将必须重载强制转换运算符 public class F
  • 从 DataRow 单元格解析 int [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 如何从 DataRow 单元格解析 int 值 Int32 Parse item QuestionId ToString 这段代码可以工作 但看
  • C++ 中是否有与 PHP 的explode() 函数等效的函数? [复制]

    这个问题在这里已经有答案了 可能的重复 在 C 中分割字符串 https stackoverflow com questions 236129 splitting a string in c 在 PHP 中 explode 函数将获取一个字
  • 连接到没有元数据的网络服务

    我想连接到此网络服务 https training api temando com schema 2009 06 server wsdl https training api temando com schema 2009 06 serve
  • “1个未解决的外部”C++

    我已经检查了所有文件之间的连接以及类和函数定义 但每次我尝试运行我的程序时 它都会阻止我并告诉我它有 1 个未解析的外部 该程序应该打开多个文件 一个 学生 文件和一个 成绩 文件 从中读取数据 然后使用 查询文件 来查找数据 找到查询中要
  • 当我的进程被终止时到底会发生什么?

    我有一个包含本机代码和托管代码的混合进程 在 Windows Server 2003 上运行 当我从进程资源管理器中终止进程时 它会进入 100 cpu 的状态 并在消失之前保持这种状态一段时间 有时甚至 10 分钟 在此期间我无法 杀死
  • 在windows + opengl中选择图形设备

    我知道如何使用 openGL 打开窗口 使用 Win32 或其他工具包 但是当系统有2块显卡时 如何选择要渲染的图形设备 我的编程语言是 C 我专注于 Windows 但任何示例都将受到欢迎 编辑 也许更好地解释我的问题是个好主意 以便添加

随机推荐

  • Go实战学习笔记-1.2基础语法:变量、常量、包、指针等

    1 前言 这里总结一下Go中变量 常量 包 函数 指针 输入输出及基础数据类型转换的基础用法 便于回顾 本次总结的内容大致如下 2 变量variables 变量声明以及可代表的类型很多 var是变量声明的关键字 但也可以使用 进行短声明 如
  • TrueChain development preparation articles - tune test code, perform unit test

    Original link TrueChain development environment currently supports Windows MacOS Linux This section describes how to per
  • Docker学习(三)——docker容器与主机,容器与容器数据共享

    Docker学习 三 docker容器与主机 容器与容器数据共享 1 容器 主机间数据拷贝 2 容器 主机间数据挂载 volume技术 2 1 命令行方式挂载 2 2 补充 涉及到的简单linux命令 2 3 命令行挂载的三种格式 2 4
  • c++字符串转字符数组_C++字符数组和字符串——字符替换

    总时间限制 1000ms内存限制 65536kB 描述 把一个字符串中特定的字符全部用给定的字符替换 得到一个新的字符串 输入 只有一行 由一个字符串和两个字符组成 中间用单个空格隔开 字符串是待替换的字符串 字符串长度小于等于30个字符
  • 操作hdfs 报错 拒绝连接 解决方法

    问题描述 在进行hdfs操作时 无论操作什么都会报错并显示诸如ls Call From Master 192 168 14 54 to Master 8020 failed on connection exception java net
  • [管理与领导-40]:IT基层管理者 - 做事管理 - 计划到位,干活不累;计划不到位,累死累活不得好

    前言 计划到位 干活不累 计划不到位 累死累活不得好 很多人对计划有一种误解 以为做计划就是纸面上的工作 就是指定时间计划 就是上级给下级指派任务 很显然 这种对计划的误解导致很多人不屑做计划 实际定计划的重点是对目标非分解 分解成可执行的
  • matlab暑期学习笔记(2)——元胞数组、结构数组

    结构数组的定义 hhh 2 1 name tony hhh 2 1 num 1 hhh 2 2 name lily hhh 2 2 num 3 注意 必须用 括号 结果显示 hhh 2x2 struct array with fields
  • C++ 随机数种子

    今天学习了C 生成随机数 记录心得 include
  • Web自动化测试01:认识web自动化在什么项目中适用

    系列文章目录 软件测试功能到自动化学习路线图 2022年最新版技术栈 软件测试01 从了解测试岗位职能和测试流程开始 附作业 软件测试02 6大实际案例手把手教你设计测试点 软件测试03 用例执行以及缺陷管理的学习 附禅道下载使用流程 软件
  • Dalsa网口线阵相机例程(转载的挺不错的帖子,感谢作者)

    在网上狂搜资料 搜到了两个大佬的两篇好文章 dalsa 8k线阵网口相机c 开发 https blog csdn net baidu 30028771 article details 64628784 DALSA相机SDK不完全教程 htt
  • 【华为OD机试真题 JAVA】快递运输

    JS版 华为OD机试真题 JS 快递运输 标题 快递运输 时间限制 1秒 内存限制 262144K 语言限制 不限 一辆运送快递的货车 运送的快递均放在大小不等的长方体快递盒中 为了能够装载更多的快递 同时不能让货车超载 需要计算最多能装多
  • Jest结合Vue-test-utils使用的初步实践

    介绍 Vue test utils是Vue的官方的单元测试框架 它提供了一系列非常方便的工具 使我们更加轻松的为Vue构建的应用来编写单元测试 主流的 JavaScript 测试运行器有很多 但 Vue Test Utils 都能够支持 它
  • STM32(HAL库)驱动(2.0寸)TFT-LCD彩屏(240*320)

    目录 1 简介 2 CubeMX初始化配置 2 1 基础配置 2 1 1 SYS配置 2 1 2 RCC配置 2 2 屏幕引脚配置 2 3 项目生成 3 KEIL端程序整合 3 1 LCD驱动添加 3 2 函数修改 3 2 1 lcd h修
  • ssm dao层无法注入

    在ssm项目中通过ClassPathXmlApplicationContext获取持久层 然后测试mapper 遇到BindingException异常 org apache ibatis binding BindingException
  • PCIe专题学习——5.0(总线电源管理)

    之前我们讲了对PCIe的一些基础概念作了一个宏观的介绍 了解了PCIe是一种封装分层协议 packet based layered protocol 主要包括事务层 Transaction layer 数据链路层 Data link lay
  • Jmeter教程(一) - 入门

    Jmeter教程 一 入门Jmeter教程 二 自定义变量模拟多用户Jmeter教程 三 Linux中使用命令行进行压测 一 下载 登录官网Jmeter下载 得到压缩包jmeter 5 0 tgz 下载地址 http jmeter apac
  • CMS垃圾回收器

    目录 1 CMS收集器 2 CMS收集过程 3 CMS垃圾收集实践 4 CMS垃圾收集优缺点 4 1 分配担保机制 4 2 CMS的问题 5 小结 前言 虽然新出的G1优点明显 但是CMS算法依然是目前项目中使用的最多的垃圾收集器 G1可能
  • xp系统sc服务器,Windows XP系统服务配置攻略 SC Config

    Windows XP系统服务配置攻略 SC Config IT168 实用技巧 对于经常重装系统的朋友来说 出于优化系统 减少内存占用亦或增强系统安全性能 往往都会修改很多系统服务的启动类型 将大量无用或者危险的服务关闭 参照许多服务优化的
  • Qt5设置窗口、控件背景、字体颜色及无边框

    Qt5设置窗口 控件背景 字体颜色及无边框 无边框设置 以QTextbroswer为例 代码设置 使用样式表 ui gt describeText gt setStyleSheet QTextBrowser border width 0 b
  • 如何使用全局变量QT

    兩種方法 第一 使用extern關鍵字聲明 不推薦 破壞了封裝性 第二 新建一個類 存放全局的變量 函數 第一 使用extern關鍵字聲明 不推薦 破壞了封裝性 在一个头文件中声明int var name全局变量 在另一个cpp文件中引用此