【问题标题】:Communicate with two instances of Qt program与 Qt 程序的两个实例通信
【发布时间】:2015-10-05 22:26:50
【问题描述】:

我在我的 Qt 程序代码中使用以避免打开第二个实例:

#include "mainwindow.h"
#include <QApplication>
#include <QSharedMemory>
#include <QDebug>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

        const char* MEM_KEY = "42";

        QSharedMemory sharedMem(MEM_KEY);

        if (sharedMem.create(1024)) 
        {
            qDebug() << "Create shared memory";
        } 
        else 
        {
            if (sharedMem.error() == QSharedMemory::AlreadyExists) 
            {
                qWarning() << "Already create. Exiting process";
                return 1;
            }
        }
        MainWindow w;
        w.setWindowFlags(Qt::MSWindowsFixedSizeDialogHint);
        w.show();
        return a.exec();

它可以工作(此代码块打开我的应用程序的第二个实例[它自动关闭]),但我想将消息或信号从打开的第二个实例发送到第一个实例以执行 ex。最大化第一个实例的窗口。你能告诉我如何简单地做到这一点吗?

【问题讨论】:

  • 你能解释一下吗?我是 Qt 的初学者,我不明白你的代码在做什么。 “它有效” .. 什么有效?我的意思是“避免打开第二个实例”,您通常不需要做任何事情(......除了不打开第二个实例)而且我在代码中看不到任何其他实例。
  • 我已经编辑了我的帖子。你现在明白了吗?
  • 我不是 100% 确定。你……当程序第一次启动时,用一个键(42)创建一些共享内存。当它第二次创建时,创建这个共享内存将失败(因为它已经存在)并且你退出应用程序......?如果是,我有 2 个 cmets: 1) 如果其他应用程序已经使用相同的密钥创建了一些共享内存怎么办? 2) 你不能用这个共享内存来传递消息吗?
  • 请查看@Amartel 的回答。它解决了我的问题。我的代码很糟糕:/

标签: c++ qt


【解决方案1】:

您可以为此目的使用QtSingleApplication。例如:

int main(int argc, char *argv[])
{
    QtSingleApplication a(argc, argv);
    if (a.isRunning())
    {
        a.sendMessage("42");
        qWarning() << "Already create. Exiting process";
        return 1;
    }

    MainWindow w;
    a.setActivationWindow(&w);
    QObject::connect(&a, SIGNAL(messageReceived(QString))
                     , &w, SLOT(onMessageReceived(QString)));
    w.show();

    int ret = a.exec();
    QObject::disconnect(&a, 0, &w, 0);
    return ret;
}

...

void MainWindow::onMessageReceived(const QString &message)
{
    // Do stuff
}

【讨论】:

  • 我会检查一下,稍后我会告诉你是否对我有帮助。
  • 谢谢 :D 这个库太棒了!我的问题解决了。
【解决方案2】:

您正在寻找IPC进程间通信),遗憾的是,我认为没有可移植的方式来做这件事,除了创建一个套接字并监听127.0.0.1 .但是,如果您使用的是 unix,我建议您使用 qdbus。这就是所有很酷的 linux 程序都在做的事情 ;)

在 Windows 上,我相信有类似的东西。 (但这一切都没有内置在 qt 中。)您可以找到窗口的 句柄 (HWND) 并使用 sendmessage()。 要发送自定义消息,您必须通过以下方式声明自己的 WM_SECONDINSTANCE(或类似名称):

#define WM_SECONDINSTANCE WM_USER
#define WM_SOMEOTHERMESSAGE WM_USER+1

或使用枚举(我很懒)。 这告诉您现有的实例已打开另一个实例。要在 qt 中处理它,请查看 this

要找到HWND,我会从您的第一个实例将其放入您的共享内存中。 (我的windows知识有点生疏,如有错误请见谅)

【讨论】:

    猜你喜欢
    • 2013-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-15
    • 2020-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多