Qt提供了宏 Q_GLOBAL_STATIC(官方说明文档:https://doc.qt.io/qt-5/qglobalstatic.html ), 用于创建全局静态对象。鉴于此,我们可以通过这个宏就能轻松实现单例(且线程安全)。举例说明:我们希望存储全局变量或者参数,且只能通过一个地方(必须为单例模式)就能设置或者访问,那么就可以设计一个AppData类,专门用于存储全局变量,实现代码如下:
示例代码
#include <QCoreApplication>
#include <QVariant>
#include <QDebug>
class AppData
{
public:
//singleton
static AppData *Instance();
//
void SetValue(QString key, QVariant var)
{
if (m_keyValues.contains(key)) {
m_keyValues[key] = var;
}
else {
m_keyValues.insert(key, var);
}
}
//
QVariant GetValue(QString key)
{
if (m_keyValues.contains(key)) {
return m_keyValues.value(key);
}
return QVariant();
}
protected:
explicit AppData(void){};
virtual ~AppData(void){};
private:
QVariantMap m_keyValues;
};
#if 0
Q_GLOBAL_STATIC(AppData, getInstance)
#else
class AppDataProvider : public AppData {};//set AppData() protected
Q_GLOBAL_STATIC(AppDataProvider, getInstance)
#endif
AppData *AppData::Instance()
{
return getInstance;
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
//set value
AppData::Instance()->SetValue("1", "1-first");
AppData::Instance()->SetValue("2", "2-second");
AppData::Instance()->SetValue("3", "3-third");
AppData::Instance()->SetValue("1int", 1);
AppData::Instance()->SetValue("2int", 2);
AppData::Instance()->SetValue("3int", 3);
//get value
qDebug() << AppData::Instance()->GetValue("1").toString();
qDebug() << AppData::Instance()->GetValue("2").toString();
qDebug() << AppData::Instance()->GetValue("3").toString();
qDebug() << AppData::Instance()->GetValue("1int").toInt();
qDebug() << AppData::Instance()->GetValue("2int").toInt();
qDebug() << AppData::Instance()->GetValue("3int").toInt();
return a.exec();
}
输出结果
"1-first"
"2-second"
"3-third"
1
2
3