在Qt中隐藏和重新启动QApplication的同一个实例

时间:2014-03-13 12:22:40

标签: c++ windows qt qapplication

我有QApplication我有自定义QDialog。该对话框为用户提供了一组选项,然后通过QProcess启动流程。虽然启动的流程仍在运行,但应用程序如果关闭仍必须运行。为实现这一目标,我根据流程是否启动,重新实施了closeEvent QWidgetaccept() ed或ignore()事件。

closeEvent()函数中,我隐藏了QDialog。这样,对于用户,应用程序将关闭(但它将在任务管理器中运行)。我希望用户通过再次运行程序来重新启动应用程序。在这一点上,我需要弄清楚另一个实例已在运行,并且该实例应该到达前台。

任何人都可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:2)

Pre Qt 5有一个名为QtSingleApplication的项目,该项目只允许一个应用程序实例运行,如果用户试图打开另一个应用程序,则会引发正在运行的应用程序。

如果您使用Google搜索“qtsingleapplication qt5”,您可以找到有关QtSingleApplication修复程序的更多信息,以便与Qt5一起使用。

This thread也可能会有所帮助。

答案 1 :(得分:2)

可以使用命名互斥来解决。

article有用。

WINAPI WinMain(
  HINSTANCE, HINSTANCE, LPSTR, int)
{
  try {
    // Try to open the mutex.
    HANDLE hMutex = OpenMutex(
      MUTEX_ALL_ACCESS, 0, "MyApp1.0");

    if (!hMutex)
      // Mutex doesn’t exist. This is
      // the first instance so create
      // the mutex.
      hMutex = 
        CreateMutex(0, 0, "MyApp1.0");
    else
      // The mutex exists so this is the
      // the second instance so return.
      return 0;

    Application->Initialize();
    Application->CreateForm(
      __classid(TForm1), &Form1);
    Application->Run();

    // The app is closing so release
    // the mutex.
    ReleaseMutex(hMutex);
  }
  catch (Exception &exception) {
    Application->
      ShowException(&exception);
  }
  return 0;
}