Russian Qt Forum
Апрель 19, 2024, 07:16 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: В qtSingleApplications не работает сигнал commitDataRequest(). Что делать?  (Прочитано 3098 раз)
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« : Октябрь 21, 2014, 22:55 »

Я использую 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.html
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.

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

Собираю информацию по крупицам
http://webhamster.ru
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #1 : Октябрь 21, 2014, 23:56 »

На ЛОРе помогли.

В документации кривизна.

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

Код:
connect(qApp, SIGNAL(commitDataRequest(QSessionManager)), SLOT(commitData(QSessionManager)));

А надо:

Код:
connect(qApp, SIGNAL(commitDataRequest(QSessionManager&)), this, SLOT(commitData(QSessionManager&)));
Записан

Собираю информацию по крупицам
http://webhamster.ru
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



Просмотр профиля WWW
« Ответ #2 : Октябрь 22, 2014, 00:09 »

в 5.3.1 в документации нет никакой кривизны. может просто сам амперсанд не заметил? Улыбающийся
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
qate
Супер
******
Offline Offline

Сообщений: 1175


Просмотр профиля
« Ответ #3 : Октябрь 22, 2014, 07:49 »

в qt5 стараюсь использовать новый синтаксис подключения слотов - тогда уже на этапе компиляции будет видна ошибка
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.05 секунд. Запросов: 22.