【问题标题】:user interface inside QSystemTrayIcon context menuQSystemTrayIcon 上下文菜单中的用户界面
【发布时间】:2017-12-13 10:52:41
【问题描述】:

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

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

我该怎么做?

【问题讨论】:

  • 你的问题有点含糊,但我怀疑QWidgetAction 可能是你要找的。​​span>
  • 我的意思是我知道如何创建一个简单的上下文菜单。我在问题本身中对此进行了描述。但这将是列表中最常见的菜单,我想创建一个高级菜单,如图所示。精美地放置按钮、绘制表格等。
  • 对,这就是QWidgetAction 允许您通过将QWidgetQAction 关联而不是仅限于文本/图标等来做的事情。

标签: c++ linux qt ubuntu


【解决方案1】:

好吧,是的,最好给你看代码:


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();
}

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

【讨论】:

  • 我一直在尝试将 QWidgetAction 与 QSystemTrayIcon 一起使用,但我的自定义小部件显示为空白(就像您上一个屏幕截图中一样)。知道为什么吗?在普通的上下文菜单中添加相同的 QWidgetAction() 效果很好。似乎是系统托盘上下文菜单导致了问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-10
  • 2021-07-09
  • 2019-05-07
  • 1970-01-01
  • 2012-03-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多