思路
原始的Tray只能有菜单,不能放表格,浏览器等其他东西,不太灵活,需要弹出的界面自定义。完成自定义弹出界面思路如下:
- 新建TrayWidget界面类,用于显示托盘弹出的界面。
- 新建CustomTray类,继承QSystemTrayIcon。
- 重新onIconActived方法,show出TrayWidget界面。
效果
程序运行截图如下:
鼠标右键点击:
弹出的界面就是TrayWidget.ui,在此界面上美化即可。
关键代码
CustomTrayIcon.h
#ifndef TRAYWIDGET_H
#define TRAYWIDGET_H
#include <QWidget>
namespace Ui {
class TrayWidget;
}
class TrayWidget : public QWidget
{
Q_OBJECT
public:
explicit TrayWidget(QWidget *parent = nullptr);
~TrayWidget();
protected slots:
void closeBtnClicked();
void hideBtnClicked();
private:
Ui::TrayWidget *ui;
};
#endif // TRAYWIDGET_H
CustomTrayIcon.cpp
#include "CustomTrayIcon.h"
#include "TrayWidget.h"
#include <QDebug>
#include <QScreen>
#include <QApplication>
CustomTrayIcon::CustomTrayIcon(QObject *parent)
: QSystemTrayIcon{parent}
{
initTrayWidget();
connect(this, &QSystemTrayIcon::activated, this, &CustomTrayIcon::onIconActivated);
}
CustomTrayIcon::~CustomTrayIcon()
{
delete this->m_trayWidget;
}
void CustomTrayIcon::initTrayWidget()
{
this->m_trayWidget = new TrayWidget;
}
QSize CustomTrayIcon::getScreenSize()
{
QScreen *screen = qApp->primaryScreen();
QSize size;
size.setWidth(0);
size.setHeight(0);
if(screen){
QRect geometry = screen->availableGeometry();
size.setWidth(geometry.width());
size.setHeight(geometry.height());
}
return size;
}
void CustomTrayIcon::onIconActivated(QSystemTrayIcon::ActivationReason reason)
{
if (reason == QSystemTrayIcon::Context) {
//QPoint pos = QCursor::pos();
QSize screenSize = getScreenSize();
QPoint pos;
m_trayWidget->show(); //show than move
pos.setX(screenSize.width() - m_trayWidget->frameGeometry().width());
pos.setY(screenSize.height() - m_trayWidget->frameGeometry().height());
m_trayWidget->move(pos);
}
}
TrayWidget.h
#ifndef TRAYWIDGET_H
#define TRAYWIDGET_H
#include <QWidget>
namespace Ui {
class TrayWidget;
}
class TrayWidget : public QWidget
{
Q_OBJECT
public:
explicit TrayWidget(QWidget *parent = nullptr);
~TrayWidget();
protected slots:
void closeBtnClicked();
void hideBtnClicked();
private:
Ui::TrayWidget *ui;
};
#endif // TRAYWIDGET_H
TrayWidget.cpp
#include "TrayWidget.h"
#include "ui_TrayWidget.h"
#include <QDebug>
#ifdef Q_OS_WIN
#include <windows.h>
#endif
TrayWidget::TrayWidget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::TrayWidget)
{
ui->setupUi(this);
setWindowFlags(Qt::Tool | Qt::FramelessWindowHint);
#ifdef Q_OS_WIN
SetWindowPos((HWND)this->winId(), HWND_TOPMOST, this->pos().x(), this->pos().y(), this->width(), this->height(), SWP_SHOWWINDOW);
#endif
connect(ui->closePushButton, &QPushButton::clicked, this, &TrayWidget::closeBtnClicked);
connect(ui->hidePushButton, &QPushButton::clicked, this, &TrayWidget::hideBtnClicked);
}
TrayWidget::~TrayWidget()
{
delete ui;
}
void TrayWidget::closeBtnClicked()
{
qApp->exit();
}
void TrayWidget::hideBtnClicked()
{
this->hide();
}