查找QWidget的单个实例Qt应用程序

我试图创build一个单一的实例Qt应用程序,我在这一点上工作,但现在我想集中已经开始的实例,当第二个启动。 QWidget :: find(g_hWnd)应该返回小部件,但它失败并崩溃w-> show();

有什么想法吗?

#pragma data_seg("Shared") HWND g_hWnd = NULL; #pragma data_seg() #pragma comment(linker,"/section:Shared,rws") int main(int argc, char *argv[]) { if (g_hWnd) { QWidget* w = QWidget::find(g_hWnd); w->show(); return 0; } else { QApplication a(argc, argv); mainWindow w; w.show(); g_hWnd = a.topLevelWidgets().at(0)->winId(); //or w.winId()? return a.exec(); } } 

编辑:我现在看到Trolltech发布了LGPL下的QtSingleApplication类。

Solutions Collecting From Web of "查找QWidget的单个实例Qt应用程序"

你应该使用qtsingleapplication API

编辑 – 这是一个单独的下载在这里看到 LGPL和商业版本

 #include <QtGui/QApplication> #include "mainwindow.h" #include <QMessageBox> #include <QSharedMemory> int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; QSharedMemory shared("61BB200D-3579-453e-9044-"); if(shared.create(512,QSharedMemory::ReadWrite)==true) { QMessageBox msgBox; msgBox.setText("I am first."); msgBox.exec(); } else { QMessageBox msgBox; msgBox.setText("i am already running."); msgBox.exec(); exit(0); } //shared.AlreadyExists() w.show(); return a.exec(); } 

这可能是你遇到的问题:

WI QWidget :: winId()const

返回窗口小部件的窗口系统标识符。

原则上是便携的,但是如果你使用它,你很可能要做一些不可移植的东西。 小心。

如果一个窗口小部件是非本地的(外来的),winId()被调用,那么这个窗口小部件将被提供一个本地句柄。

注意:我们建议您不要存储此值,因为它可能在运行时更改。

资源

我怀疑你的方法正在工作。

最好的方法仍然是运行从特定套接字侦听的本地服务器(请参阅QLocalserver )。 新启动的实例将检测正在运行的服务器,并可以管道同意的命令来设置焦点,打开新文件等。

类似的方法是使用命名的共享内存(请参阅QSharedMemory )。 和以前一样,如果共享内存已经存在,对方可以通过发送适当的命令来控制它。