Qt 5.3中的全局变量

时间:2014-05-28 21:39:22

标签: c++ qt opencv

在Visual Studio 2012(C ++)中,在开头声明变量就足以具有全局作用域并同时设置变量的值。 如何在Qt 5.3中创建全局变量并初始化?

我试图在头文件中声明它,但是我遇到了一个问题:"只有静态const积分数据成员可以在类中初始化"。

提前致谢!

1 个答案:

答案 0 :(得分:12)

全局变量

创建一个"全球"变量,你需要让它可供所有人使用,你需要将它声明一次,只需要一次。

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

声明:

一般来说,全局变量和公共静态成员都有点危险/不受欢迎,特别是如果你不确定自己在做什么的话。对象和方法以及私有和受保护类型的所有OOP优点都会消失,可读性也会下降。可维护性可能会变得混乱。请参阅下面的更深入的答案:

Are global variables bad?

QSettings

对于某些全球设置,我已经使用QSettings取得了巨大成功。

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

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

希望有所帮助。