2017-01-21 9 views
0

Вот мои настройки:Как написать приложение для системного трея QT без класса окна и интегрировать его с другим процессом?

  • Фоновый процесс, который продолжает работать, и делает его работу.

  • Пусковая установка, которая запускает вышеупомянутый процесс и контролирует его, перезапускает его, если он разбился или погиб.

Я хотел бы добавить доступ в системном трее в процесс пусковой установки (и процесс пусковой идеале будет содержать код для отображения в системном трее) и включить основные параметры (запуск, остановку и т.д.), чтобы быть вызван из системного трея контекстное меню. В системном лотке нет Нужно окно собственного. Просто системный лоток без окон с контекстным меню, содержащим 2-3 варианта.

Поскольку весь код, написанный до сих пор, находится на C/C++, и мне нужно, чтобы он работал в Windows и Linux, QT встречается как очевидный выбор. Я обнаружил, что довольно сложно пропустить базовый дисплей лотка пусковой установки QT. Почти каждый пример, который я видел в QSystemTrayIcon, включает в себя наследование «mainwindow».

Ниже приведен код, который я использую для создания системного трея.

#include <QtWidgets/QApplication> 
#include <QtCore/QDebug> 
#include <QtGui/QIcon> 
#include <QtWidgets/QSystemTrayIcon> 
#include <QtWidgets/QMainWindow> 
#include <QtWidgets/QMenu> 


int main(int argc, char **argv) 
{ 
    QApplication app(argc, argv); 
    QPixmap oPixmap(32,32); 
    //QMenu* menu1 = new QMenu(); // want to get a context menu from system tray 
    oPixmap.load ("systemTrayIcon.png"); 

    QIcon oIcon(oPixmap); 

    QSystemTrayIcon *trayIcon = new QSystemTrayIcon(oIcon); 
    qDebug() << trayIcon->isSystemTrayAvailable(); 
    trayIcon->setContextMenu(menu1); 
    trayIcon->setVisible(true); 
    trayIcon->showMessage("Test Message", "Text", QSystemTrayIcon::Information, 1000); 

    return app.exec(); 
} 

Код отображается в системном трее в порядке, но я не смог обойти, как добавить меню к нему. Что я хочу:

1) Добавить контекстное меню в системном трее выше, без добавления какого-либо класса окна (если это не представляется возможным)

2) Соедините эти пункты контекстного меню для функций в моем существующем код

3) App.exec() представляет собой бесконечный цикл, который обрабатывает события QT. Однако, поскольку моя пусковая установка имеет собственный цикл событий, я хочу сделать так, чтобы цикл событий QT был интегрирован с моей петлей запуска. Другими словами, добавьте некоторые задачи, отличные от QT, к циклу событий.

+1

Для пункта 3. см. [Здесь] (http://stackoverflow.com/questions/1051333/combing-an-external-event-loop-with-qts). Хотя я бы посоветовал вам создать поток для вашей собственной вещи, если ему постоянно нужно что-то обрабатывать. Кроме того, почему этот вопрос отмечен как C, так и C++? Я не вижу проблем с совместимостью языка. Пожалуйста, исправьте теги соответственно. – tambre

+0

Спасибо за информацию. Он помечен как C и C++, так как это языки, которые я разрабатываю. В отличие от python. Вероятно, по той же причине, что связанный с вами вопрос помечен как C++? – 16tons

+0

Ну, конечно, вы должны пометить соответствующий язык, но я не вижу здесь кода C, поэтому я считаю, что тег C не имеет значения. – tambre

ответ

1

С учетом пояснений из комментариев у вас есть несколько вариантов того, как получить код, вызываемый для контекстного меню или действий активации.

  1. Объект-приемник: в основном, какие примеры использования, просто вы не получаете свой класс приемника из любого типа окна. Для макро на основе соединений сигнал/слот, базовый тип должен быть QObject или что-то происходит от того, для указателя на функцию на основе подключения может быть любого класса

    class MyReceiver : public QObject 
    { 
        Q_OBJECT 
    public slots: 
        void onActivated(QSystemTrayIcon::ActivationReason reason); 
    }; 
    
    
    // in main() 
    MyReceiver receiver; 
    
    // macro based connect 
    connect(trayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), 
         &receiver, SLOT(onActivated(QSystemTrayIcon::ActivationReason))); 
    
    
    // or function pointer based connect 
    connect(trayIcon, &QSystemTrayIcon::activated, 
         &receiver, &MyReceiver::onActivated); 
    
  2. Connect для автономных функций

    void onActivated(QSystemTrayIcon::ActivationReason reason); 
    
    
    connect(trayIcon, &QSystemTrayIcon::activated, &onActivated); 
    
  3. с способной среде C++ 11, подключение к лямбда

    connect(trayIcon, &QSystemTrayIcon::activated, 
         [](QSystemTrayIcon::ActivationReason reason) {}); 
    

Для контекстного меню применяются те же методы, объекты «отправителя» - это объекты QAction, которые вы добавляете в меню, и их сигнал triggered() или toggled(bool) в зависимости от того, можно ли просто нажать или переключить действие, и «включить» и «выключено».