Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Unnamed_Hero от Февраль 20, 2010, 21:47



Название: QSystemTrayIcon->showMessage ошибка позиционирования при старте программы
Отправлено: Unnamed_Hero от Февраль 20, 2010, 21:47
Программа имеет только иконку в трее. При старте при стечении определённых обстоятельств показывает уведомление с помощью showMessage объекта трея. Но при этом сообщение показывается в левом верхнем углу (хотя трей - в правом нижнем). Во всем остальных случаях уведомление показывается нормально, надо иконкой. Рабочая среда - KDE 4.4, Qt 4.6.2 (хотя наблюдал ещё во времена 4.3)

Код:
nTray->show();
nTray->showMessage (...);
Есть мнение, что программа не успевает осознать, что нарисовалась иконка в трее, вставил между show и showMessage
Код:
app->processEvents(); //app-указатель на объект QApplication
, но не помогло. Что ещё можно наколдовать, чтобы работало корректно?


Название: Re: QSystemTrayIcon->showMessage ошибка позиционирования при старте программы
Отправлено: Rcus от Февраль 20, 2010, 22:22
Иксы же :) Судя по $QTDIR/src/gui/util/qsystemtrayicon_x11.cpp иконки в области уведомления являются обычными окнами, а сама область - окном со спец флагами. Указанный эффект наблюдается в силу асинхронности работы иксов (и тут дело даже не в X сервере, а в оконном менеджере). Можно вставить задержку с обработкой событий или просто вызвать showMessage одноразовый таймер.


Название: Re: QSystemTrayIcon->showMessage ошибка позиционирования при старте программы
Отправлено: SABROG от Февраль 20, 2010, 22:57
showMessage() в конструкторе вызывается?


Название: Re: QSystemTrayIcon->showMessage ошибка позиционирования при старте программы
Отправлено: Unnamed_Hero от Февраль 20, 2010, 23:05
showMessage() в конструкторе вызывается?
нет, но метод, в котором вызывается showMessage вызывается из конструктора.
Если нарисовать иконку в конструкторе, а потом в методе, вызванном через таймер вызвать уведомление - то всё нормально.
Но если в конструкторе не нарисовать иконку, а рисовать в методе показа уведомления - опять криво показывает...

Можно вставить задержку с обработкой событий или просто вызвать showMessage одноразовый таймер.

одноразовый таймер не умеет принимать параметры в слот :(
Не хочется плодить глобальные переменные ради этого...


Название: Re: QSystemTrayIcon->showMessage ошибка позиционирования при старте программы
Отправлено: SABROG от Февраль 20, 2010, 23:16
Вижу 2 варианта:

- завести сигнал типа invokeLater(arg1, arg2, ...) Подключить к слоту в котором вызывается showMessage() как Qt::QueuedConnection. Сделать emit invokeLater(...) в конструкторе. Тогда сообщение появится только после того как программа войдет в цикл событий, то есть когда вся инициализация приложения завершится.

- вызвать QMetaObject::invokeMethod() с Qt::QueuedConnection. Это избавит от создания лишнего сигнала, позволит передать параметры, но в слоте sender() будет не валидным.


Название: Re: QSystemTrayIcon->showMessage ошибка позиционирования при старте программы
Отправлено: Unnamed_Hero от Февраль 21, 2010, 00:13
- вызвать QMetaObject::invokeMethod() с Qt::QueuedConnection. Это избавит от создания лишнего сигнала, позволит передать параметры, но в слоте sender() будет не валидным.

Пробовал этот вариант, но неудачно... Всё равно уезжает. Думаю, всё же тут дело в оконном менеджере.

В итоге реализовал через лишнюю глобальную переменную в классе и вызовом через пару секунд через QTimer::singleShot...
Но спасибо за интересные идеи!