QSystemTrayIcon上下文菜单中的用户界面

时间:2017-12-13 10:52:41

标签: c++ linux qt ubuntu

我是creatig托盘图标应用程序,我想创建高级上下文菜单,如下图所示,但我只知道,如何创建简单的菜单

QMenu* menu = new QMenu()
menu->addAction(QIcon(), "item", item1Click);
trayIcon->setContextMenu(menu);

我该怎么做? first example second example

1 个答案:

答案 0 :(得分:0)

嗯,是的,最好向你展示代码:


main.h

#ifndef MAIN_H
#define MAIN_H

#include <QtWidgets/QApplication>
#include <QtCore/QDebug>
#include <QtGui/QIcon>
#include <QtWidgets/QSystemTrayIcon>
#include <QtWidgets/QMainWindow>
#include <QtWidgets/QMenu>
#include <QtWidgets/QWidgetAction>
#include <QtWidgets/QPushButton>
#include <QtWidgets/QHBoxLayout>
#include <QtWidgets/QSpinBox>
#include <QtWidgets/QLabel>

class SpinBoxAction : public QWidgetAction
{
public:
    SpinBoxAction (const QString& title) : QWidgetAction (NULL)
    {
        QWidget* Widget = new QWidget (NULL);
        QHBoxLayout* Layout = new QHBoxLayout();
        QLabel* Label = new QLabel (title);
        Layout->addWidget (Label);
        SpinBox = new QSpinBox(NULL);
        Layout->addWidget (SpinBox);
        Widget->setLayout (Layout);

        setDefaultWidget(Widget);
    }

    QSpinBox* spinBox()
    {
        return SpinBox;
    }

private:
    QSpinBox* SpinBox;
};

class Reciever : public QObject
{
private:
    QSystemTrayIcon* trayIcon;
public:
    Reciever()
    {

    }
    void setup(QSystemTrayIcon* trayIcon)
    {
        this->trayIcon = trayIcon;
    }

    Q_OBJECT
public slots:
    void action(int i)
    {
        trayIcon->showMessage("changed", "spin box value has been changed", QSystemTrayIcon::NoIcon, 1000);
    }

    void onActivated(QSystemTrayIcon::ActivationReason reason)
    {
        trayIcon->showMessage("activated", "tray icon has been activated", QSystemTrayIcon::NoIcon, 1000);
    }
};

#endif // MAIN_H


main.cpp中

#include <main.h>
#include <QtWidgets/QApplication>
#include <QtCore/QDebug>
#include <QtGui/QIcon>
#include <QtWidgets/QSystemTrayIcon>
#include <QtWidgets/QMainWindow>
#include <QtWidgets/QMenu>
#include <QtWidgets/QWidgetAction>
#include <QtWidgets/QPushButton>
#include <QtWidgets/QHBoxLayout>

int main(int argc, char** argv)
{
    Reciever* reciever = new Reciever();

    QApplication app(argc, argv);

    QSystemTrayIcon* trayIcon = new QSystemTrayIcon(QIcon(":/images/abc.png"));
    if (!trayIcon->isSystemTrayAvailable()) exit(1);

    QMenu* menu = new QMenu();
    SpinBoxAction* spinBoxAction = new SpinBoxAction("Action Title");
    menu->addAction(spinBoxAction);

    QObject::connect(spinBoxAction->spinBox(), SIGNAL(valueChanged(int)), reciever, SLOT(action(int)));

    trayIcon->setContextMenu(menu);
    trayIcon->setVisible(true);

    QObject::connect(trayIcon, &QSystemTrayIcon::activated, reciever, &Reciever::onActivated);
    reciever->setup(trayIcon);

    return app.exec();
}

它导致带有一个空元素的简单列表菜单:
result of this