Qt实现任务栏中的托盘图标的功能.

看我们电脑最下面一行的任务栏,会发现有一些软件被关闭后,还会继续存在任务栏中,当点击任务栏中的图标时,又会跳出来这个软件的画面,主要用到了Qt中的QSystemTrayIcon这个类,下面我们来简单的展示下实现的方法:

//"c.cpp"的代码:
#include "c.h"
c::c(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);
    //创建一个菜单,只包含一个quit菜单项.
    m_menu = new QMenu;
    m_quitAction = new QAction("quit", this);
    m_menu->addAction(m_quitAction);
    //创建一个QSyStemTrayIcon的对象.
    m_trayIcon = new QSystemTrayIcon();
    //设置图标.
    m_trayIcon->setIcon(QIcon("tray.ico"));
    //设置右键菜单.
    m_trayIcon->setContextMenu(m_menu);
    m_trayIcon->show();
    //设置提示.
    m_trayIcon->setToolTip("click me~!");
    //设置显示一个messageBox3秒.
    m_trayIcon->showMessage(QString::fromLocal8Bit("成功"), QString::fromLocal8Bit("您已成功连接到网络!"),QSystemTrayIcon::Information,3);

    //这个是对于托盘图标的触摸事件,当被单击,双击等时发出信号.
    connect(m_trayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(trayIconTouchSlot(QSystemTrayIcon::ActivationReason)));
    //当点击图标上面的messageBox时发出信号.这里只是用来演示这个信号.
    connect(m_trayIcon, SIGNAL(messageClicked()), this, SLOT(messageClickedSlot()));
    //对图标右键产生的菜单的quit菜单项做出操作.
    connect(m_quitAction, SIGNAL(triggered()),this, SLOT(quitActionSlot()));
}
c::~c()
{

}
void c::trayIconTouchSlot(QSystemTrayIcon::ActivationReason type)
{
    //判断用户对图标触摸的类型.是双击,还是点击,还是右击等等.
    switch (type)
    {
    case QSystemTrayIcon::Trigger:
    case QSystemTrayIcon::DoubleClick:
        //正常模式显示.
        this->showNormal();
        //当前窗口显示为顶级窗口,如果没有这条语句的话,窗口就可能会出现在底层,被别的页面层覆盖而看不到了.
        this->activateWindow();
        break;
    default:
        break;
    }
}
void c::messageClickedSlot()
{
    QMessageBox::information(this, "clicked", "clicked!");
}
void c::closeEvent(QCloseEvent *event)
{
    //当我们点击右上角的X时,有些软件只是想把软件最小化,还是可以通过任务栏的图标来显示窗口的.
    this->setVisible(false);
    //对关闭事件做出一个反应.
    event->ignore();
}
void c::quitActionSlot()
{
    //关闭程序.
    QApplication::exit(-1);
}

下面是”c.h”头文件的代码:

#ifndef C_H
#define C_H

#include <QtWidgets/QMainWindow>
#include "ui_c.h"
#include <QSystemTrayIcon>
#include <QAction>
#include <QMenu>
#include <QMessageBox>
#include <QCloseEvent>
#include <QMouseEvent>

class c : public QMainWindow
{
    Q_OBJECT

public:
    c(QWidget *parent = 0);
    ~c();
private slots:
    void trayIconTouchSlot(QSystemTrayIcon::ActivationReason type);
    void messageClickedSlot();
    void quitActionSlot();
protected:
    void closeEvent(QCloseEvent *event);
private:
    Ui::cClass ui;
    QSystemTrayIcon *m_trayIcon;
    QMenu *m_menu;
    QAction *m_quitAction;
};

#endif // C_H
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
QT ,可以通过设置窗口的窗口状态(WindowState)来实现点击缩小变为任务栏图标功能。具体步骤如下: 1. 在窗口类添加一个槽函数,用于处理窗口最小化时的动作,例如: ```c++ private slots: void on_minimize_clicked(); ``` 2. 在槽函数设置窗口状态为最小化,例如: ```c++ void MainWindow::on_minimize_clicked() { setWindowState(Qt::WindowMinimized); } ``` 3. 在窗口类的构造函数连接最小化按钮的点击事件到槽函数,例如: ```c++ connect(ui->btn_minimize, &QPushButton::clicked, this, &MainWindow::on_minimize_clicked); ``` 4. 在窗口类添加一个事件过滤器,用于捕获窗口状态改变事件,例如: ```c++ bool MainWindow::eventFilter(QObject *obj, QEvent *event) { if (event->type() == QEvent::WindowStateChange) { if (windowState() == Qt::WindowMinimized) { hide(); trayIcon->show(); } } return QObject::eventFilter(obj, event); } ``` 5. 在窗口类的构造函数安装事件过滤器,例如: ```c++ installEventFilter(this); ``` 6. 创建一个托盘图标对象,并设置点击托盘图标时的动作,例如: ```c++ trayIcon = new QSystemTrayIcon(this); trayIcon->setIcon(QIcon(":/images/icon.png")); trayIcon->setToolTip("My Application"); connect(trayIcon, &QSystemTrayIcon::activated, this, &MainWindow::on_trayIcon_activated); ``` 7. 在窗口类添加一个槽函数,用于处理点击托盘图标时的动作,例如: ```c++ void MainWindow::on_trayIcon_activated(QSystemTrayIcon::ActivationReason reason) { if (reason == QSystemTrayIcon::Trigger) { show(); trayIcon->hide(); setWindowState(Qt::WindowNoState); } } ``` 通过以上步骤,就可以实现点击缩小变为任务栏图标功能了。当用户点击最小化按钮时,窗口状态被设置为最小化,并隐藏窗口,显示托盘图标。当用户点击托盘图标时,窗口被显示,并隐藏托盘图标

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值