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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: kde4 - notifications, python, pyqt  (Прочитано 4596 раз)
razum2um
Гость
« : Май 07, 2009, 19:52 »

Получить иконку в трее - это одно. (QSystemTrayIcon)
Подскажите, как показывать всплывающие уведомления?!
Проблема в том, что уведомление выскакивает не от иконки, а в левом верхнем углу экрана. о_О
(независимо от того, где находится сам трей)
Код:
self.tray_icon = QSystemTrayIcon()
self.tray_icon.setIcon(QIcon('icon.png'))
self.tray_icon.show()
self.tray_icon.showMessage('It\'s me', 'Hello world!')
--------------------------------------------------
Qt 4.5.0 KDE 4.2 python2.5, PyQt-4.4.4-r2
Записан
Admin
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1988



Просмотр профиля
« Ответ #1 : Май 08, 2009, 12:57 »

Я бы попробовал покопаться в исходниках qutim - icq клиента.
Записан
razum2um
Гость
« Ответ #2 : Май 08, 2009, 19:33 »

Оно конечно, хорошо, но там уведомление другое, не привязанное к трею.
(этак, батенька, Qlabel фиксированных размеров можно по таймеру со опр. скоростью менять координаты отрисовки
Но муторно так решать такую задачу...
Не бейте, я новичек, и C++ что-то чуждое еще.Я ж написал свои ср-ва разработки...
Т.е использование кода напрямую исключено =( )
Короче я отлично помню, что в 3х кедах уведомления kteatime&kopete работали.
Более того, мне такой дизайн нравится больше, чем стандарт в кедах сейчас...
---
Резюме:
пожалуйста, подскажите, как там kteatime работает. Что за QPoint? Как получается, что оно работает?
сам пошел проверять гипотезу про qutim.
------
UPD kteatime код из четверки, уведомление qt-шное.
Код:
connect(this, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(showPopup(QSystemTrayIcon::ActivationReason)));
.......
......
void TopLevel::showPopup(QSystemTrayIcon::ActivationReason reason)
{
    if(reason==QSystemTrayIcon::Context) {
        m_popup->setVisible(false);
    }
    else if(reason==QSystemTrayIcon::Trigger || reason==QSystemTrayIcon::DoubleClick) {
        if(m_popup->isVisible())
            m_popup->setVisible(false);
        else
            m_popup->show(calculatePopupPoint());
    }
}


QPoint TopLevel::calculatePopupPoint()
{
    QPoint pos=geometry().topLeft();

    int x=pos.x();
    int y=pos.y();
    int w=m_popup->minimumSizeHint().width();
    int h=m_popup->minimumSizeHint().height();

    QRect r=KGlobalSettings::desktopGeometry(QPoint(x+w/2,y+h/2));

    if(x<r.center().x())
        x+=geometry().width();
    else
        x-=w;

    if((y+h)>r.bottom())
        y=r.bottom()-h;

    if((x+w)>r.right())
        x=r.right()-w;

    if(y<r.top())
        y=r.top();

    if(x<r.left())
        x=r.left();

    return QPoint(x,y);
}

« Последнее редактирование: Май 08, 2009, 19:53 от razum2um » Записан
razum2um
Гость
« Ответ #3 : Июль 04, 2009, 00:02 »

Проблема решена таким образом
Записан
shadone
Гость
« Ответ #4 : Июль 10, 2009, 19:21 »

К сожалению это известная проблема, пока не решена: http://www.trolltech.com/developer/task-tracker/index_html?method=entry&id=195042

Проблема возникает из-за асинхронности X-сервера, т.к. после вызова show() окно на самом деле еще не показано и его координаты неизвестны. В качестве "хака" - вызывать processEvents() перед показом сообщения. Но и это решение не обязательно будет работать (зависит от скорости и загруженности компьютера и от window manager).
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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