Я использую
qtSingleApplications для того, чтобы программа на десктопе запускалась в одном экземпляре. Это обертка над QApplication (по сути просто класс
QtSingleApplication, унаследованный от
QApplication), в котором происходят проверки, не запущено ли еще одно такое же приложение.
Взять пропатченный qtSingleApplications для Qt5 можно тут:
https://qt.gitorious.org/qt-solutions/lgeyers-qt-solutions/source/c50d0f3f142606b823f9106c7cd8b9a7d066e6ff:
Для компиляции, возможно придется немного доработать:
1. В qtlocalpeer.cpp добавить
#include <unistd.h>
в условие #if defined(Q_OS_UNIX)
2. В qtsingleapplication.cpp закомментировать реализацию (она все равно не используется)
QtSingleApplication::QtSingleApplication(int &argc, char **argv, Type type)
: QApplication(argc, argv, type)
{
sysInit();
}
И в qtsingleapplication.h закомментировать этот прототип.
Создание объекта приложения происходит так же, как и при использовании обычного
QApplication:
QtSingleApplication app(argc, argv);
return app.exec();
Так вот, мне, помимо всего прочего, надо ловить момент выхода из DE. Это делается через менеджер сессии:
http://qt-project.org/doc/qt-5/session.htmlhttp://qt-project.org/doc/qt-5/qsessionmanager.html#allowsInteractionДля отлова момента выхода из DE, в основном окне устанавливается следующий сигнал и слот:
connect(qApp, SIGNAL(commitDataRequest(QSessionManager)), this, SLOT(commitData(QSessionManager)));
Проблема в том, что при запуске программы появляется предупреждение:
QObject::connect: No such signal QtSingleApplication::commitDataRequest(QSessionManager) in ../mytetra/src/views/mainWindow/MainWindow.cpp:102
И естественно, обработки сигнала
commitDataRequest не происходит.
Вопрос: почему у
QtSingleApplication нет сигнала
commitDataRequest?
Класс
QtSingleApplication унаследован от
QApplication, а
QApplication унаследован от
QGuiApplication, у которого в паблике есть сигнал
commitDataRequest.
В чем проблема, как исправить?