在QT C++中的QSystemTrayIcon附近显示QWidget或QWindow

use*_*609 5 c++ qt qt-creator

我设法让QSystemTrayIcon看起来像这样:

假设VMWare图标是我的QSystemTrayIcon

使用以下代码行(信号槽工作):

#include "dialog.h"
#include "ui_dialog.h"
#include <QMessageBox>
#include <form.h>

Dialog::Dialog(QWidget *parent)
    : QDialog(parent), ui(new Ui::Dialog)
{
    ui->setupUi(this);

    QIcon icon("/Users/JohnnyAppleseed/IMAGE.png");
    m_ptrTrayIcon = new QSystemTrayIcon(icon );
    m_ptrTrayIcon->setToolTip( tr( "Bubble Message" ) );
   // m_ptrTrayIcon->setContextMenu(m_trayIconMenu);
    connect(m_ptrTrayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)),
                 this, SLOT(iconActivated(QSystemTrayIcon::ActivationReason)));
}

Dialog::~Dialog()
{
    delete ui;
}
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试实现代码以显示我创建的QSystemTrayIcon附近的QWidget/QWindow时,它无法显示在它附近.它也会显示并快速消失(即使我不希望它靠近QSystemTrayIcon)使用此代码:

void Dialog::iconActivated(QSystemTrayIcon::ActivationReason reason)
{
    form fr;
    fr.setWindowFlags(Qt::Popup);

    fr.show();
}
Run Code Online (Sandbox Code Playgroud)

为了清楚起见,我想展示我的QWidget/QWindow就像VMWare Fusion的方法(或者在Microsoft Windows Vista或更高版本中找到的时钟......)

Mac OS X/Linux 没有说明

微软Windows 在此输入图像描述

有人可以指出我做错了什么吗?谢谢!

为了使事情更简单,请下载项目:http://zipshare.net/sv

更新#1

关于QWidget/QWindow轻弹问题,vahancho建议我将函数form fr;void Dialog::iconActivated(QSystemTrayIcon::ActivationReason reason)函数移动到工作窗口的标题.它成功地完成了所有感谢vahancho.窗口现在显示,但它还没有接近QSystemTrayIcon :(

vah*_*cho 4

问题是,您在堆栈中创建表单对象,并且一旦执行超出 iconActivated() 槽,该对象就会被删除。这就是为什么你一看到它它就消失了。要解决这个问题,您需要在堆中创建弹出窗口。

更新

为了将对话框放置在托盘图标附近,您必须确定托盘图标的位置。为此,您可以使用 QSystemTrayIcon::geometry() 函数。您的代码将如下所示(根据您的需要调整坐标):

QRect rect = m_ptrTrayIcon->geometry();
fr.move(rect.x(), rect.y());
fr.show();
Run Code Online (Sandbox Code Playgroud)