gpt4 book ai didi

qt - 由于激活原因,无法使 QSystemTrayIcon 正常工作

转载 作者:行者123 更新时间:2023-12-04 13:15:17 29 4
gpt4 key购买 nike

我使用的是 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 包不能很好地从托盘图标迁移到指示器,前提是指示器可以通过点击、滚轮等进行交互。真可惜!这个问题有什么解决办法吗?

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

最佳答案

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

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

https://bugreports.qt.io/

变通办法

我会在绘制指示器的指示器区域顶部制作一个 float 的无框 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();
}

关于qt - 由于激活原因,无法使 QSystemTrayIcon 正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11562319/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com