2012-05-18 3 views
3

Я пишу приложение на C++ с Qt, которое использует системный лоток. Я реализовал системный лоток, используя класс QSystemTrayIcon, как показано в примерах, но он не имеет того же поведения, что и другие значки в системном трее, которые присутствуют на моем компьютере. Например, у меня есть Spotify, установленный на Ubuntu 12.04, и он показывает значок в системном трее с выпадающим меню. С моим приложением он показывает значок в системном трее с контекстным меню, то есть вы должны щелкнуть его правой кнопкой мыши, чтобы сделать меню активным. С помощью Spotify все, что нужно сделать, - это щелкнуть по значку и отобразить меню. Что я могу сделать, чтобы получить значки в системном трее в Ubuntu? Я в порядке с использованием специального кода для X11/Linux, а не встроенных функций Qt. Большое спасибо.Приложение для системного лотка Linux Qt/C++

Вот мой код:

void MainWindow::closeEvent(QCloseEvent *event) 
{ 
    if (trayIcon->isVisible()) { 
     hide(); 
     event->ignore(); 
    } 
} 

void MainWindow::createActions() 
{ 
    restoreAction = new QAction(tr("&Show"), this); 
    connect(restoreAction, SIGNAL(triggered()), this, SLOT(show())); 

    quitAction = new QAction(tr("&Exit"), this); 
    connect(quitAction, SIGNAL(triggered()), qApp, SLOT(quit())); 
} 

void MainWindow::createTrayIcon() 
{ 
    trayIconMenu = new QMenu(this); 
    accountsMenu = trayIconMenu->addMenu(tr("Accounts")); 
    trayIconMenu->addSeparator(); 
    trayIconMenu->addAction(restoreAction); 
    trayIconMenu->addSeparator(); 
    trayIconMenu->addAction(quitAction); 

    trayIcon = new QSystemTrayIcon(this); 
    trayIcon->setContextMenu(trayIconMenu); 
} 

ответ

4

Попробуйте выпадающее меню из activated сигнала QSystemTrayIcon.

void Window::iconActivated(QSystemTrayIcon::ActivationReason reason) 
{ 
    switch (reason) { 
     case QSystemTrayIcon::Trigger: 
      // show your menu here 
    } 
} 
+0

Это отобразит меню, но оно отображает только контекстное меню, и я хочу, чтобы оно отображало неконтекстное меню. Я думаю, что это может иметь какое-то отношение к Unity, но я не уверен на 100%. –

+0

Я буду отмечать ваш ответ как правильный ответ, но я все равно хотел бы знать, как связать себя в глобальной системе меню Ubuntu. Qt 4.8.1 по-видимому не использует глобальную систему меню, и я не могу найти параметр, чтобы включить его в сборках. –

+0

Что вы подразумеваете под «системой глобального меню»? Меню, которое обычно находится в верхнем левом углу окна, которое в ubuntu в верхней части экрана? – graphite

0

я комментирую на благо других здесь ... я была такая же проблема, когда мы развернули наш продукт (построен с использованием Qt) на Ubuntu 12.04 LTS. Мы используем способ развертывания qt.conf. После много охоты и прохождения через источник на sni-qt я обнаружил, что плагины должны быть правильно обнаружены. Поэтому я создал и скопировал плагины из нашей среды сборки в каталог плагинов относительно моего пути приложения, упомянутого в qt.conf, против записи «Plugins =». Также убедитесь, что sni-qt обновлен и установлен на развернутом компьютере Ubuntu 12.04. Появились меню, появляющиеся в других приложениях для лотков. Вы можете копировать плагины из/usr/lib/i386-linux-gnu/qt4/plugins/на 32-битной машине или ее эквивалентном пути на 64-битной машине. Для этой проблемы необходим плагин под systemtrayicon.

HTH.