3

我使用的是 Ubuntu 12.04,虽然我可以创建一个带有可用菜单的托盘图标,但我无法控制它的操作:

    trayIcon = new QSystemTrayIcon(this);
    trayIcon->setIcon(QIcon(":/icons/Pictures/icon.png"));
    trayIcon->setToolTip(QString("Hello there..."));

    connect(trayIcon,SIGNAL(activated(QSystemTrayIcon::ActivationReason)),this,SLOT(clickSysTrayIcon(QSystemTrayIcon::ActivationReason)));
    connect(this,SIGNAL(minimized()),this,SLOT(hide()),Qt::QueuedConnection);

    QMenu *changer_menu = new QMenu;
    Show_action = new QAction(tr("S&how"),this);
    Show_action->setIconVisibleInMenu(true);
    connect(Show_action, SIGNAL(triggered()), this, SLOT(showClicked()));
    changer_menu->addAction(Show_action);
    changer_menu->addSeparator();
    Quit_action = new QAction(tr("&Quit"), this);
    Quit_action->setIconVisibleInMenu(true);;
    connect(Quit_action, SIGNAL(triggered()), this, SLOT(close_minimize()));
    changer_menu->addAction(Quit_action);

    trayIcon->setContextMenu(changer_menu);
    trayIcon->show();

clickSysTrayIcon(QSystemTrayIcon::ActivationReason) 如下:

void MainWindow::clickSysTrayIcon(QSystemTrayIcon::ActivationReason reason)
{
    //reason is a variable that holds the type of activation or click done on the icon tray
    qDebug() << "I'm in!";
}

并且,在头文件中定义为:

private Q_SLOTS:
    void clickSysTrayIcon(QSystemTrayIcon::ActivationReason reason);

但是,我无法得到“我在!” 要显示的消息。我试图通过左/右键单击、中键单击和鼠标滚轮使其工作,但我从未看到输出此消息。

怎么了?

编辑:特定系统 Ubuntu 12.04 似乎有问题,因为它不再使用托盘图标而只使用指示器。因此,有一个程序使用托盘图标并将它们转换为指标。但是,然后指标的功能就消失了。我知道这是系统的错,因为相同的程序,在相同的代码下,在 Lubuntu 12.04 和 LXDE 桌面下完美运行。

我为此责怪Ubuntu。sni-qt 包没有很好地从托盘图标迁移到指示器,前提是指示器可以在点击、滚轮等上进行交互。真可惜!这个问题有什么解决办法吗?

我的赏金结束了,所以如果有人可以解决这个问题,我将不胜感激!

4

1 回答 1

2

向对项目影响最大的人提出问题。

https://help.ubuntu.com/community/ReportingBugs#How_to_report_bugs

https://bugreports.qt.io/

解决方法

我会在绘制指示器的指示器区域顶部制作一个浮动的无框 qwidget,然后在其上添加适当的 mouseEvent 函数。

这是这种解决方法的起点。我不知道这是多么洁净,但它在 Windows 中运行良好。我知道有一些适用于 Windows 的 UI 调整和工具使用这种分层元素,例如 DisplayFusion 和 TeamViewer。我还没有在 Ubuntu 中测试过它,但它应该以同样的方式工作。

#include <QtGui/QWidget>
#include <QMenu>
#include <QSystemTrayIcon>
#include <QMouseEvent>
#include <QPixmap>
#include <QAction>
#include <QDebug>
#include <QPaintEvent>
#include <QPainter>
#include <QApplication>
#include <QTimerEvent>

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = 0)
        : QWidget(parent)
    {
        // setup this widget to be borderless, transparent around the image
        // and always on top
        // and not to have a presence in the "visible window list"
        this->setWindowFlags( Qt::WindowStaysOnTopHint |
                              Qt::FramelessWindowHint | Qt::Tool);
        this->setAttribute(Qt::WA_TranslucentBackground);

        // necessary if you want to track when you enter and leave the widget's rect with the mouse
        this->setMouseTracking(true);

        m_trayIcon = new QSystemTrayIcon(this);
        m_trayIcon->setIcon(QIcon("icon1.ico"));
        m_trayIcon->setToolTip(QString("Hello there..."));

        m_changer_menu = new QMenu;

        m_show_action = new QAction(tr("S&how"),this);
        m_show_action->setIconVisibleInMenu(true);

        connect(m_show_action, SIGNAL(triggered()), this, SLOT(showClicked()));

        m_changer_menu->addAction(m_show_action);
        m_changer_menu->addSeparator();

        m_quit_action = new QAction(tr("&Quit"), this);
        m_quit_action->setIconVisibleInMenu(true);;

        connect(m_quit_action, SIGNAL(triggered()), this, SLOT(close_minimize()));

        m_changer_menu->addAction(m_quit_action);

        m_trayIcon->setContextMenu(m_changer_menu);
        m_trayIcon->show();

        QPixmap p("icon2.ico");
        m_pix = p.scaled(QSize(m_trayIcon->geometry().width(),
                                   m_trayIcon->geometry().height()),
                             Qt::IgnoreAspectRatio,
                             Qt::SmoothTransformation);
        this->move(m_trayIcon->geometry().x() ,m_trayIcon->geometry().y());
        this->resize(m_trayIcon->geometry().width(), m_trayIcon->geometry().height());

//        qDebug() << m_trayIcon->geometry();
//        qDebug() << this->geometry();
        // This assumes that the notification is stationary.  If you want it to move
        // with the tray icon underneath, you will need to subclass QSystemTrayIcon
        // and track its move and resize and probably also its show and hide events

        // raise itself 15x a second
        this->startTimer(1000/15);
    }

    ~Widget(){ }

public slots:
    void mouseDoubleClickEvent(QMouseEvent *)
    {
        qDebug() << Q_FUNC_INFO;
    }

    void mouseReleaseEvent(QMouseEvent * me)
    {
        qDebug() << Q_FUNC_INFO;
        switch(me->button())
        {
        case Qt::LeftButton:
            qDebug() << "Left Click";
            break;
        case Qt::RightButton:
            qDebug() << "Right Click";
            m_changer_menu->popup(this->geometry().topLeft() + me->pos());
            break;
        default:
            qDebug() << "other click";
            break;
        }
    }

    void showClicked()
    {
        qDebug() << Q_FUNC_INFO;
    }

    void close_minimize()
    {
        qDebug() << Q_FUNC_INFO;
        qApp->exit();
    }

    void paintEvent(QPaintEvent *)
    {
        QPainter aPainter(this);
        aPainter.drawPixmap(rect(), m_pix);
    }

    void timerEvent(QTimerEvent *)
    {
        if(!m_changer_menu->isVisible())
            this->raise();
    }

private:
    QPixmap m_pix;
    QSystemTrayIcon * m_trayIcon;
    QMenu * m_changer_menu;
    QAction * m_quit_action;
    QAction * m_show_action;
};

这是主要功能...

#include <QtGui/QApplication>
#include "widget.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();

    return a.exec();
}
于 2012-07-28T01:40:57.813 回答