LINUX.ORG.RU

В qtSingleApplications не работает сигнал commitDataRequest(). Что делать?

 


0

1

Я использую qtSingleApplications для того, чтобы программа на десктопе запускалась в одном экземпляре. Это обертка над QApplication (по сути просто класс QtSingleApplication, унаследованный от QApplication), в котором происходят проверки, не запущено ли еще одно такое же приложение.

Взять пропатченный qtSingleApplications для Qt5 можно тут:

https://qt.gitorious.org/qt-solutions/lgeyers-qt-solutions/source/c50d0f3f142...

Для компиляции, возможно придется немного доработать:

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. Это делается через менеджер сессии:

1. http://qt-project.org/doc/qt-5/session.html

2. http://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.

В чем проблема, как исправить?

★★★★★
int i,n = qApp->staticMetaObject.methodCount();
for(i=0;i<n;i++)
  qDebug()<<i<<qApp->staticMetaObject.method(i).methodSignature();
anonymous
()
Ответ на: комментарий от anonymous

Точняк, ошибка в документации.

Сказано, что:

connect(qApp, SIGNAL(commitDataRequest(QSessionManager)), SLOT(commitData(QSessionManager)));

А надо:

connect(qApp, SIGNAL(commitDataRequest(QSessionManager&)), SLOT(commitData(QSessionManager&)));
Xintrea ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.