Qt 5.3中的全局变量

7
在Visual Studio 2012 (C++)中,只需在开头声明变量即可使其具有全局作用域,并同时设置变量的值。但是,在Qt 5.3中如何创建全局变量并初始化呢?
我尝试在头文件中声明它,但是遇到了一个问题:“只有静态常量整型数据成员可以在类内进行初始化”。
提前感谢!

1
(2)看起来你正在处理普通的类成员变量(而不是全局变量),所以这个问题没有意义。最简单的解决方法是将成员变量初始化移动到类构造函数中。 (3)这个问题似乎与Qt或OpenCV无关。 - nobody
1
那些是成员,不是全局变量,初始化在VS中也不应该起作用。另外,oVideoWriter 怎么会不可见呢?你是尝试在成员函数之外使用它吗? - molbdnilo
全局变量是有害的。请使用类变量代替。 - berak
@AndrewMedico 好的,我做到了。(2)这个问题有意义吗?我试图初始化成员变量(dialog.cpp),但仍然得到消息:"未使用的变量"。(3)也许这个问题似乎与OpenCV无关... 但它是关于QT如何在这里创建全局变量并初始化它们的。 - Pavlo Zvarych
@molbdnilo 我的意思是,尽管我在dialog.h中声明了这个变量,但在dialog.cpp中却收到了“未声明的标识符”的消息。抱歉,我不明白你最后一个问题的意思。 - Pavlo Zvarych
1个回答

17

全局变量

要创建一个“全局”变量,您需要使其对所有人可用,并且只需要声明一次。

globals.h

#ifndef GLOBALS_H
#define GLOBALS_H

#include <qtglobal.h>

// ALL THE GLOBAL DECLARATIONS

// don't use #include <QString> here, instead do this:

QT_BEGIN_NAMESPACE
class QString;
QT_END_NAMESPACE

// that way you aren't compiling QString into every header file you put this in...
// aka faster build times.

#define MAGIC_NUM 42

extern qreal g_some_double; // Note the important use of extern!
extern QString g_some_string;

#endif // GLOBALS_H

globals.cpp

#include "globals.h"
#include <QString>

// ALL THE GLOBAL DEFINITIONS

qreal g_some_double = 0.5;
QString g_some_string = "Hello Globals";

现在,如果您想要访问这些危险的全局变量,您需要在任何文件的顶部进行如下设置:

#include "globals.h"

// ...

// short example of usage

qDebug() << g_some_string << MAGIC_NUM;

g_some_double += 0.1;

总之,globals.h包含了全局函数和变量的所有原型,然后在globals.cpp中进行描述。

公共静态成员变量和方法

对于这些内容,它们与上面的示例类似,但是它们包含在您的类中。

myclass.h

class MyClass
{
    public:
    static int s_count; // declaration
}

myclass.cpp

int MyClass::s_count = 0; // initial definition

然后从程序的任何部分,您都可以输入以下内容:
qDebug() << MyClass::s_count;

或者

MyClass::s_count++;// etc

免责声明:

一般来说,全局变量和公共静态成员有点危险/不被赞同,特别是如果你不确定自己在做什么。所有面向对象编程的好处,如对象、方法、私有和受保护的都会消失,可读性也会下降。而且可维护性会变得混乱。请参见下面更详细的SO答案:

全局变量是否有害?

QSettings

对于一些全局设置,我使用了QSettings并取得了很大的成功。

http://qt-project.org/doc/qt-5/QSettings.html#details

https://stackoverflow.com/a/17554182/999943

希望这可以帮到您。


为什么在global.h中不要使用#include <QString>?为什么要将Class QString;封装在QT_BEGIN_NAMESPACEQT_END_NAMESPACE中? - S.M.Mousavi
您的免责声明非常有帮助,请所有读者仔细阅读。 - S.M.Mousavi
我在代码的注释中解释了为什么。它可以加快编译时间。 - phyatt
前置声明 class QString; 由于 QString 是 Qt 命名空间的一部分,因此被包装在 Qt 命名空间中。在几个示例中,我已经看到过这种做法。这里有一个更好/更长的解释: http://wiki.qt.io/Qt-In-Namespace - phyatt
当你说“任何部分”时,是否包括在void定义内部? - Sigur
Void表示它是一个没有返回值的函数。是的,全局变量可以在函数内部使用。 - phyatt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接