在 QT C++ 中的 QSystemTrayIcon 附近显示 QWidget 或 QWindow
Show QWidget or QWindow near QSystemTrayIcon in QT C++
我已经设法让 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();
}
为了清楚起见,我想展示我的 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)
函数移至 header 的工作 window。多亏了 vahancho,它才得以成功运行。 window 现在出现了,但它还没有靠近 QSystemTrayIcon :(
问题是您在堆栈中创建了表单对象,一旦执行完 iconActivated() 插槽,它就会被删除。这就是为什么它一看到它就消失了。要解决您需要在堆中创建弹出窗口的问题。
更新
为了将对话框放置在托盘图标附近,您必须确定托盘图标的位置。为此,您可以使用 QSystemTrayIcon::geometry() 函数。你的代码看起来像(根据你的需要调整坐标):
QRect rect = m_ptrTrayIcon->geometry();
fr.move(rect.x(), rect.y());
fr.show();
我已经设法让 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();
}
为了清楚起见,我想展示我的 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)
函数移至 header 的工作 window。多亏了 vahancho,它才得以成功运行。 window 现在出现了,但它还没有靠近 QSystemTrayIcon :(
问题是您在堆栈中创建了表单对象,一旦执行完 iconActivated() 插槽,它就会被删除。这就是为什么它一看到它就消失了。要解决您需要在堆中创建弹出窗口的问题。
更新
为了将对话框放置在托盘图标附近,您必须确定托盘图标的位置。为此,您可以使用 QSystemTrayIcon::geometry() 函数。你的代码看起来像(根据你的需要调整坐标):
QRect rect = m_ptrTrayIcon->geometry();
fr.move(rect.x(), rect.y());
fr.show();