Qt托盘图标窗口

Qt托盘图标窗口,qt,Qt,我正在使用QT.QSystemTrayIcon创建托盘图标 当点击托盘图标时,我需要一个窗口,在图标的正上方(右下角)打开。我该怎么做?您是说在托盘图标上方打开一个窗口,如QMainWindow或QWidget void main_window::create_tray_icon() { m_tray_icon = new QSystemTrayIcon(QIcon(":/icon.png"), this); QAction *quit_action = new QActi

我正在使用
QT.QSystemTrayIcon
创建托盘图标


当点击托盘图标时,我需要一个窗口,在图标的正上方(右下角)打开。我该怎么做?

您是说在托盘图标上方打开一个窗口,如QMainWindow或QWidget

 void main_window::create_tray_icon()
 {
    m_tray_icon = new QSystemTrayIcon(QIcon(":/icon.png"), this);

    QAction *quit_action = new QAction( "Exit", m_tray_icon );
    connect( quit_action, SIGNAL(triggered()), this, SLOT(on_exit()) );

    QAction *another_action = new QAction( "Do something", m_tray_icon );
    connect( another_action, SIGNAL(triggered()), this, SLOT(on_do_something()) );

    QMenu *tray_icon_menu = new QMenu;
    tray_icon_menu->addAction( another_action );
    tray_icon_menu->addAction( quit_action );

    m_tray_icon->setContextMenu( tray_icon_menu );

    m_tray_icon->show();
  }

您需要使用
QApplication::desktop()
获得一个
QDesktopWidget
,然后查询该QDesktopWidget的
screenGeometry()
函数以确定屏幕尺寸,然后创建一个窗口,并根据从
screenGeometry()获得的坐标将其适当定位在右下角

我不知道你说的窗口到底是什么意思。我的第一个答案是指弹出的上下文菜单,您可以在其中添加多个操作


如果您想像在Windows中一样拥有一个包含消息的小信息窗口,您应该使用。您可以在此处弹出一条消息,设置此消息的持续时间并为其设置图标。

如果要打开与图标对齐的窗口(如内置音量控制所做的),请查看,了解以下信息:

QRect QSystemTrayIcon::geometry()
好的,我在四年后回答,因为我今天发现了这个问题,试图解决同样的问题


注意:这在Win上运行良好,在XP、7和8上进行了测试,但正如@MichaelScheper所指出的,这在Mint/GNOME上不起作用。欢迎对其他平台进行反馈。

请为您的问题使用更好的语法。如果任务栏已移动到其他位置(屏幕的一侧或顶部),则可能重复的语法不会将窗口放在托盘图标附近,并且在多显示器情况下也可能失败。此外,不同的平台在不同的地方放置托盘图标。这看起来像是添加了一个菜单,而不是一个窗口。我遗漏了什么吗?我担心,这最多只能在某些平台上起作用。在我的Mint/GNOME环境中,这将返回一个
QRect(0,0,22,22)
。图标看起来像是22×22,所以看起来我们可以得到它的大小,但不能得到它的位置,这才是真正需要的。(我的托盘图标是屏幕右侧的四分之三,因此(0,0)绝对不正确。)@MichaelScheper感谢您的反馈。我真的无法在很多平台上测试它。在Windows中,它在XP、7、8中运行良好,提供了大小和位置。您使用的是自定义图标驳接还是默认菜单栏?几周后,我需要将一些应用程序移植到Linux,然后我将尝试进行一些测试。不用担心,我很快就会以另一种方式移植。:-)我使用的是PyQt Python绑定,但除此之外,我非常确定我的代码非常普通:在初始化
QDialog
时,我正在执行
self.trayIcon=qsystemmtrayicon(self)
self.trayIcon.setIcon(myIcon)
self.trayIcon.show()
日志记录.debug('trayIcon geometry:%s',.trayIcon.trayIcon.geometry())
。我刚刚在Windows中尝试过,它确实返回了坐标。我想现在我将在可用的地方使用它们,如果我找到了Linux解决方案,请告诉您。