当前位置: 首页 > news >正文

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();
}

http://www.xdnf.cn/news/196849.html

相关文章:

  • 用于表格数据的神经网络分类器_TabPFN
  • Vuex持续保存数据 页面刷新不丢失 vuex-persistedstate
  • WPF 程序监控硬件设备状态变化的实现方案
  • vscode源代码管理Tab-文件右侧标志(M、A 等)的含义
  • await和async
  • (28)VTK C++开发示例 ---添加坐标轴
  • std::print 和 std::println
  • echarts自定义图表--仪表盘
  • 【机器学习】人工智能在电力电子领域的应用
  • 反射与注解实现动态功能扩展案例-插件系统
  • 模型上下文协议(MCP)深度解析:大模型从“思考者“进化为“行动者“
  • 总账主数据——Part 2 科目-4
  • 优先队列和单调队列(双端队列实现的)
  • stm32wb55rg (1) 基于IAR 创建stm32 工程模板
  • 序列密码算法ShanLooog512设计原理详解
  • DeepSearch复现篇:QwQ-32B ToolCall功能初探,以Agentic RAG为例
  • React速通笔记
  • 初识Python
  • 【Keil5-开发指南】
  • Java实现基数排序算法
  • 机器学习day2
  • 深入理解链表:从基础操作到高频面试题解析
  • 省哲学社科基金项目申请书(论证活页)模版框架参考
  • 013几何数学——算法备赛
  • web技术与Nginx网站服务
  • word2Vec与GloVe的区别
  • LeetCode 1482. 制作 m 束花所需的最少天数
  • 【SpringMVC】详解参数传递与实战指南
  • MANIPTRANS:通过残差学习实现高效的灵巧双手操作迁移
  • 策略模式:灵活的算法封装与切换