Qt笔记-自定义托盘弹出界面
思路
原始的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_OBJECTpublic: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 movepos.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_OBJECTpublic: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>
#endifTrayWidget::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);
#endifconnect(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();
}