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

标签 c++ qt qt-creator

我已经设法让 QSystemTrayIcon 可见,类似于:

Assume that the VMWare icon is my 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;
}

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

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

    fr.show();
}

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

Mac 操作系统/Linux No description

微软 window enter image description here

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

为了让事情变得更简单,下载项目:http://zipshare.net/sv

更新 #1

关于 QWidget/QWindow 闪烁问题,vahancho 建议我将 form fr;void Dialog::iconActivated(QSystemTrayIcon::ActivationReason 原因) 函数到工作窗口的标题。多亏了 vahancho,它才得以成功运行。窗口现在出现了,但它还没有靠近 QSystemTrayIcon :(

最佳答案

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

更新

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

QRect rect = m_ptrTrayIcon->geometry();
fr.move(rect.x(), rect.y());
fr.show();

关于c++ - 在 QT C++ 中的 QSystemTrayIcon 附近显示 QWidget 或 QWindow,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30693068/

相关文章:

c++ - 在 QTCreator 中链接到 user32.lib

android - mingw32-make `-j` 选项是否损坏?

c++ - 如何在 mfc 中更正此错误?

c++项目设计-私有(private)继承和 "is a"关系

c++ - 如何从 QDir 和相对文件路径创建绝对文件路径?

linux - Linux 发行版上的 windeployqt.exe

c++ - 这是重载左流运算符的正确方法吗? (C++)

c++ - 不区分大小写的 std::string.find()

c++ - Qt/C++ - 转换原始二进制数据并将其显示为图像(即 QImage)

c++ - 让 QtWebKit 在 Qt Creator 中工作