我可以为 2 个或更多应用程序进行 QSettings 设置吗?
Can I make QSettings settings for 2 or more applications?
有 2 个应用程序:
在某处创建文件,
应该沿着某个路径获取文件的内容。
我可以在第一个应用程序中指定 QSettings 中文件的路径,然后在第二个应用程序中从注册表中获取此路径并通过它到达文件吗?
请告诉我一个简单的例子。
我无法建议基于注册表的跨平台方法,但想展示另一种方法。
方法一(基于普通ini文件)
- 将路径存储在一些常用的ini文件中,例如在
<some_common_path>/settings_common.ini
中。两个应用程序都应有权访问文件:
App 1(作者)
#include <QtCore/QCoreApplication>
#include <QSettings>
#include <QDebug>
#include <QThread>
const QString CommonSettingsFilePath = "c:/temp/settings_common.ini";
const QString CommonKey = "common/path";
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
for(;;)
{
static int it = 0;
QString pathString = QString("path_%1").arg(it++);
QSettings settings(CommonSettingsFilePath, QSettings::IniFormat);
settings.setValue(CommonKey, pathString);
QThread::sleep(1);
}
return a.exec();
}
应用 2 (Reader)
#include <QtCore/QCoreApplication>
#include <QSettings>
#include <QDebug>
#include <QThread>
const QString CommonSettingsFilePath = "c:/temp/settings_common.ini";
const QString CommonKey = "common/path";
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
for (;;)
{
QSettings settings(CommonSettingsFilePath, QSettings::IniFormat);
QString pathString = settings.value(CommonKey, "").toString();
qDebug() << "Path read from ini =" << pathString;
QThread::sleep(2);
}
return a.exec();
}
App 2 的可能输出:
Path read from ini = "path_6"
Path read from ini = "path_8"
Path read from ini = "path_9"
Path read from ini = "path_11"
...
方法二(基于进程间通信)
IPC using Qt Remote Objects API:
App1是Source, App2 (reader) will be Replica,路径是属性.
只显示要点
在 App1 和 App2 .pro 文件中添加 remoteobjects
模块:
QT += core remoteobjects ...
path.rep 文件:
#include <QtCore>
#include <QString>
class Path
{
PROP(QString path);
};
在 App1 专业版中:
REPC_SOURCE = path.rep
App1 class:
#include "rep_path_source.h"
class CommonPath : public PathSimpleSource
{
Q_OBJECT
};
然后在 App1 中:
CommonPath sourcePath;
QRemoteObjectHost sourceNode(QUrl("local:path")); // create host node
sourceNode.enableRemoting(&sourcePath); // enable remoting/sharing
...
sourcePath.setPath("some_path_aaa");
在 App2 专业版中:
REPC_REPLICA = path.rep
此外在 App2 中:
#include "rep_path_replica.h"
QSharedPointer<PathReplica> replica;
QRemoteObjectNode repNode; // create remote object node
repNode.connectToNode(QUrl("local:path")); // connect with remote host node
replica.reset(repNode.acquire<PathReplica>()); // acquire replica of source from host node
replica->waitForSource();
...
qDebug() << replica->path();
当然你可以通过这种方式分发所有必要的数据,而不仅仅是路径。
有 2 个应用程序:
在某处创建文件,
应该沿着某个路径获取文件的内容。
我可以在第一个应用程序中指定 QSettings 中文件的路径,然后在第二个应用程序中从注册表中获取此路径并通过它到达文件吗?
请告诉我一个简单的例子。
我无法建议基于注册表的跨平台方法,但想展示另一种方法。
方法一(基于普通ini文件)
- 将路径存储在一些常用的ini文件中,例如在
<some_common_path>/settings_common.ini
中。两个应用程序都应有权访问文件:
App 1(作者)
#include <QtCore/QCoreApplication>
#include <QSettings>
#include <QDebug>
#include <QThread>
const QString CommonSettingsFilePath = "c:/temp/settings_common.ini";
const QString CommonKey = "common/path";
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
for(;;)
{
static int it = 0;
QString pathString = QString("path_%1").arg(it++);
QSettings settings(CommonSettingsFilePath, QSettings::IniFormat);
settings.setValue(CommonKey, pathString);
QThread::sleep(1);
}
return a.exec();
}
应用 2 (Reader)
#include <QtCore/QCoreApplication>
#include <QSettings>
#include <QDebug>
#include <QThread>
const QString CommonSettingsFilePath = "c:/temp/settings_common.ini";
const QString CommonKey = "common/path";
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
for (;;)
{
QSettings settings(CommonSettingsFilePath, QSettings::IniFormat);
QString pathString = settings.value(CommonKey, "").toString();
qDebug() << "Path read from ini =" << pathString;
QThread::sleep(2);
}
return a.exec();
}
App 2 的可能输出:
Path read from ini = "path_6"
Path read from ini = "path_8"
Path read from ini = "path_9"
Path read from ini = "path_11"
...
方法二(基于进程间通信)
IPC using Qt Remote Objects API:
App1是Source, App2 (reader) will be Replica,路径是属性.
只显示要点
在 App1 和 App2 .pro 文件中添加 remoteobjects
模块:
QT += core remoteobjects ...
path.rep 文件:
#include <QtCore>
#include <QString>
class Path
{
PROP(QString path);
};
在 App1 专业版中:
REPC_SOURCE = path.rep
App1 class:
#include "rep_path_source.h"
class CommonPath : public PathSimpleSource
{
Q_OBJECT
};
然后在 App1 中:
CommonPath sourcePath;
QRemoteObjectHost sourceNode(QUrl("local:path")); // create host node
sourceNode.enableRemoting(&sourcePath); // enable remoting/sharing
...
sourcePath.setPath("some_path_aaa");
在 App2 专业版中:
REPC_REPLICA = path.rep
此外在 App2 中:
#include "rep_path_replica.h"
QSharedPointer<PathReplica> replica;
QRemoteObjectNode repNode; // create remote object node
repNode.connectToNode(QUrl("local:path")); // connect with remote host node
replica.reset(repNode.acquire<PathReplica>()); // acquire replica of source from host node
replica->waitForSource();
...
qDebug() << replica->path();
当然你可以通过这种方式分发所有必要的数据,而不仅仅是路径。