【发布时间】:2009-04-23 19:33:25
【问题描述】:
我正在尝试创建一个单实例 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();
}
}
编辑:我现在看到奇趣科技在 LGPL 下发布了 QtSingleApplication 类。
【问题讨论】:
-
您是否尝试过同时调试两者以确定第二个应用程序中的 g_hWnd 与第一个应用程序匹配?
-
它们不匹配,但它仍然检测到已经有一个实例在运行。
-
这很奇怪,有时g_hWnd变量值之一是0,有时它们相互匹配,但它仍然在qwidget的查找和焦点上崩溃。