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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QSystemTrayIcon->showMessage ошибка позиционирования при старте программы  (Прочитано 4753 раз)
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
, но не помогло. Что ещё можно наколдовать, чтобы работало корректно?
Записан
Rcus
Гость
« Ответ #1 : Февраль 20, 2010, 22:22 »

Иксы же Улыбающийся Судя по $QTDIR/src/gui/util/qsystemtrayicon_x11.cpp иконки в области уведомления являются обычными окнами, а сама область - окном со спец флагами. Указанный эффект наблюдается в силу асинхронности работы иксов (и тут дело даже не в X сервере, а в оконном менеджере). Можно вставить задержку с обработкой событий или просто вызвать showMessage одноразовый таймер.
Записан
SABROG
Гость
« Ответ #2 : Февраль 20, 2010, 22:57 »

showMessage() в конструкторе вызывается?
Записан
Unnamed_Hero
Гость
« Ответ #3 : Февраль 20, 2010, 23:05 »

showMessage() в конструкторе вызывается?
нет, но метод, в котором вызывается showMessage вызывается из конструктора.
Если нарисовать иконку в конструкторе, а потом в методе, вызванном через таймер вызвать уведомление - то всё нормально.
Но если в конструкторе не нарисовать иконку, а рисовать в методе показа уведомления - опять криво показывает...

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

одноразовый таймер не умеет принимать параметры в слот Грустный
Не хочется плодить глобальные переменные ради этого...
« Последнее редактирование: Февраль 20, 2010, 23:12 от Unnamed_Hero » Записан
SABROG
Гость
« Ответ #4 : Февраль 20, 2010, 23:16 »

Вижу 2 варианта:

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

- вызвать QMetaObject::invokeMethod() с Qt::QueuedConnection. Это избавит от создания лишнего сигнала, позволит передать параметры, но в слоте sender() будет не валидным.
Записан
Unnamed_Hero
Гость
« Ответ #5 : Февраль 21, 2010, 00:13 »

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

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

В итоге реализовал через лишнюю глобальную переменную в классе и вызовом через пару секунд через QTimer::singleShot...
Но спасибо за интересные идеи!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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