1
  1. MacOSX10.8 + Qt5.1 with clang 64bit
  2. 创建 Qt Gui 应用程序
  3. 在 main.cpp 我只是添加#include <QtSingleApplication>

编译错误:

../untitled/main.cpp:3:10: fatal error: 'QtSingleApplication' file not found
#include <QtSingleApplication>
         ^
1 error generated.
make: *** [main.o] Error 1

我错过了什么?


附加信息
项目文件已设置QT += widgets

我已经google了,似乎需要qtlocalpeer.cpp,qtlocalpeer.h,qtsingleapplication.cpp, qtsingleapplication.h,qtsinglecoreapplication.cpp,qtsinglecoreapplication.h,但是如何生成这些文件?

有些帖子说它需要 include qtsingleapplication.pri,但它在哪里?我搜索了我的磁盘,但找不到它。


参考
Qt 中的 SinleApplication

QtSingleApplication 类参考

Qt 示例,但在哪里下载源代码?

4

3 回答 3

7

如果您正在寻找QtSingleApplication该类的更好替代品,尤其是可以使用Qt5并支持该类的替代品,QtQuick请查看SingleApplication项目。

它用于QSharedMemory确保不会发生竞争条件,并且非常易于使用。您只需将调用替换为QApplication类似于SingleApplication工作QtSingleApplication方式:

int main(int argc, char *argv[])
{
    SingleApplication app( argc, argv );

    return app.exec();
}

它还使用本地套接字来通知您的原始(第一个)进程以初始化新进程,以便父级可以提升它的窗口。GitHub 上提供了枯燥的文档和代码。

除其他外,它还支持在新生成的实例和主实例之间发送消息。在此示例中,新实例向主实例发送包含其参数的消息。

int main(int argc, char *argv[])
{
    SingleApplication app( argc, argv, true );

    if( app.isSecondary() ) {
        app.sendMessage(  app.arguments().join(' ')).toUtf8() );
        app.exit( 0 );
    }

    return app.exec();
}
于 2015-11-04T16:19:38.457 回答
5

QtSingleApplication 不是 Qt 的官方部分,而是一个类,如果人们感兴趣,它会随它一起发布。(所有“ Qt 解决方案”都是额外的类,实际上并不是官方 Qt 库的一部分)

它不仅不是 Qt 的一部分,而且 Qt 现在是版本 5,它依赖于已弃用的 Qt4 函数。您可能需要自己编写,或修改其他人的代码。这里将是一个很好的起点Qt Solutions Archive中也可能有更新版本。

不过,要问的一个重要问题是:您的应用程序真的想要强制用户一次运​​行的应用程序副本永远不会超过一个吗?

仅仅因为它很酷而这样做实际上对用户没有好处。您正在删除 Windows 中内置的一个非常好的功能,这会妨碍您的应用程序的使用 - 所以在决定它是您真正想要添加的东西之前请仔细考虑!最好添加功能,而不是删除它们,除非在这种情况下您无能为力。而如果你忍不住,不管是什么功能,这个成本,这个损失,获得用户最好的都是值得的!=)

于 2013-07-30T03:20:37.030 回答
1

QtSingleApplication 现在已移植到 Qt 5:

https://github.com/qtproject/qt-solutions/tree/master/qtsingleapplication

于 2018-01-02T18:27:17.363 回答