与两个Qt程序实例通信
Communicate with two instances of Qt program
我在我的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();
它工作(这个代码块打开我的应用程序的第二个实例[它是自动关闭的]),但我想发送一个消息或信号从打开的时刻第二个实例到第一个实例来执行例如最大化第一个实例的窗口。你能告诉我如何简单地做这件事吗?
您可以为此目的使用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
}
您正在寻找IPC (进程间通信),遗憾的是,我认为除了创建套接字并在127.0.0.1
上侦听之外,没有一种可移植的方法可以做到这一点。但如果你在unix上,我建议使用qdbus。这就是所有很酷的linux程序所做的;)
我相信在windows上也有类似的东西。你可以找到处理你的窗口(HWND
)和使用sendmessage()
。要发送自定义消息,必须通过以下方式声明自己的WM_SECONDINSTANCE
(或类似的东西):
#define WM_SECONDINSTANCE WM_USER
#define WM_SOMEOTHERMESSAGE WM_USER+1
或使用enum(我很懒)。这将告诉您现有的实例已打开另一个实例。要在qt中处理它,请看看这个。
找到HWND
,我只是把它从你的第一个实例到你的共享内存。
相关文章:
- 为什么我的Qt程序在断言失败后继续运行?
- 使用MSVC编译的Qt程序在app.exec()上崩溃
- 如何设置一个简单的CGAL+Qt程序
- C++Qt程序设计问题
- 我的Qt程序可以编译,但是当我在声明中使用ifstream时崩溃
- 如何在Qt程序中实现IDv3标签
- 我如何将OpenSSL包含在Linux上的Qt程序中
- 我的QT程序显示带有标题的空白窗口
- 如何使用QT程序中的默认应用程序打开使用相对路径的PDF
- QT程序使用插入时会崩溃
- Qt程序读取文本只看到多行文件中的一行
- 当我尝试使用 makefile 编译我的 qt 程序时,它不起作用
- 使用现有C程序编写Qt程序时未找到的符号
- 使用Qt程序构建加密++时发生链接器错误
- 尝试实例化 QWidget 时 QT 程序出现段错误
- 为什么我的QT程序被卡住了
- 使QT/C 程序显示其文件类型,如Windows上已知
- QT程序无法编译/具有运行时错误(IDE:CodeBlocks/QTCreator)
- 如果对象父对象是窗口,则Qt程序运行缓慢
- Qt程序每次都冻结