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