与两个Qt程序实例通信

时间:2015-07-16 12:56:48

标签: c++ qt

我在我的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。最大化第一个实例的窗口。你能简单地告诉我怎么做吗?

2 个答案:

答案 0 :(得分:3)

您可以使用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
}

答案 1 :(得分:-1)

您正在寻找IPC进程间通信),遗憾的是,除了创建套接字和监听{之外,我认为没有可行的方法可以做到这一点{1}}。但如果您使用的是unix,我建议使用qdbus。这就是所有很酷的linux程序正在做的事情;)

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

WM_SECONDINSTANCE

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

要找到#define WM_SECONDINSTANCE WM_USER #define WM_SOMEOTHERMESSAGE WM_USER+1 ,我只是将它放在你的第一个实例的共享内存中。 (我的窗户知识有点生疏,对任何错误都很抱歉)