我可以为 2 个或更多应用程序进行 QSettings 设置吗?
Posted
技术标签:
【中文标题】我可以为 2 个或更多应用程序进行 QSettings 设置吗?【英文标题】:Can I make QSettings settings for 2 or more applications? 【发布时间】:2019-12-25 13:00:41 【问题描述】:有2个应用程序:
在某处创建一个文件,然后
应该沿着某个路径获取文件的内容。
我可以在第一个应用程序中指定 QSettings 中文件的路径,第二个应用程序从注册表中获取此路径并通过它找到文件吗?
请告诉我一个简单的例子。
【问题讨论】:
你可以使用IPC方法。无论是 TCP\IP 还是 D-Bus 协议(仅在 linux 中)还是共享内存 如果这两个应用程序在同一台机器上,您可以使用IPC 最合适,如果您的应用程序在不同的机器上或稍后将在不同的机器上,最好使用 Tcp/Ip 方法。 【参考方案1】:我无法建议基于注册表的跨平台方法,但想展示另一种方法。
方法一(基于普通ini文件)
-
将路径存储在一些常见的ini文件中,例如
<some_common_path>/settings_common.ini
。两个应用程序都应有权访问该文件:
应用 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(阅读器)
#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 使用 Qt Remote Objects API: App1 为Source,App2(阅读器)为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 类:
#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 设置吗?的主要内容,如果未能解决你的问题,请参考以下文章
当“对比只能应用于具有 2 个或更多水平的因素”时如何进行 GLM?