我可以为 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?

3个或更多进程之间的通信

当 MDX 查询包含 2 个或更多级别的相同维度时,速度较慢

为啥我需要 2 个或更多 Core Data 模型?

将 2 个或更多异步 HTTP 调用的结果设置为命名变量

从 Tomcat 9 到客户端的 Websocket 二进制消息拆分为 2 个或更多 tcp 数据包