【问题标题】:Find QWidget of single instance Qt application [duplicate]查找单实例Qt应用程序的QWidget [重复]
【发布时间】: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的查找和焦点上崩溃。

标签: c++ windows qt


【解决方案1】:

您应该使用qtsingleapplication API

edit- 对于 LGPL 和商业版,这是一个单独的下载 see here

【讨论】:

【解决方案2】:
#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();
}

【讨论】:

    【解决方案3】:

    这可能是您遇到的问题:

    WId QWidget::winId () 常量

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

    原则上是便携的,但如果你使用 你可能要做的 非便携的东西。小心点。

    如果小部件是非本地的(外来的)并且 winId() 在它上面被调用,那个小部件 将提供一个本机句柄。

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

    Source

    【讨论】:

      【解决方案4】:

      我怀疑你的方法行不通。

      最好的方法仍然是运行一个本地服务器(参见QLocalServer),它从特定的套接字进行侦听。一个新启动的实例将检测正在运行的服务器,并可以通过管道将同意的命令传送到例如设置焦点、打开新文件等

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-03-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-30
        • 2016-07-02
        • 1970-01-01
        相关资源
        最近更新 更多