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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT1995

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值