qt 最小化到托盘linux,Qt窗口最小化到托盘,托盘菜单控制

作为Qt初学者,最近在编写窗口最小化到托盘功能代码的时候遇到了点阻碍。

Qt自带的demo实现的功能太过繁琐,涉及知识点又太杂,很难理出最核心的思路。网上的文章代码也很多脱骨于这个demo,注释说明太少。

所以自己对比了Qt的demo和网上的文章,自己写了个简单的最小化到系统托盘的功能。

先看一下代码的实现功能:

1.空白窗口,关闭叉叉不会关闭窗口,而是最小化到托盘

2.系统托盘,单击恢复隐藏窗口

3.系统托盘,右击出现菜单,菜单有两个选项:恢复窗口、关闭程序

再看一下源代码(由于功能简单,所以很多模块功能就没有单独编写函数,都直接写在了初始化函数中)

头文件mwin.h

#ifndef MWIN_H

#define MWIN_H

#include

#include

class MWin : public QWidget

{

Q_OBJECT

public:

explicit MWin(QWidget *parent = 0);

void init();//初始化函数

QSystemTrayIcon *tray;//托盘图标

QMenu *menu;//托盘菜单

QAction *reset;//菜单实现功能:恢复窗口

QAction *quit;//菜单实现功能:退出程序

protected:

void closeEvent(QCloseEvent *event);//由于要关闭窗口变为隐藏至托盘图标,所以要重写close事件

signals:

public slots:

void TrayIconAction(QSystemTrayIcon::ActivationReason reason);//对托盘图标操作的槽:本代码实现单机图标恢复窗口功能

};

#endif // MWIN_H

解释文件mwin.cpp

#include "mwin.h"

MWin::MWin( QWidget *parent ) :

QWidget( parent )

{

init(); /* 初始化 */

}

void MWin::init()

{

/****主窗口****/

this->setFixedSize( 200, 200 );

this->setWindowTitle( "托盘APP" );

/****托盘*** */

tray = new QSystemTrayIcon( this ); /* 初始化托盘对象tray */

tray->setIcon( QIcon( QPixmap( ":/image/ico.png" ) ) ); /* 设定托盘图标,引号内是自定义的png图片路径 */

tray->show(); /* 让托盘图标显示在系统托盘上 */

QObject::connect( tray, SIGNAL( activated( QSystemTrayIcon::ActivationReason ) ), this, SLOT( TrayIconAction( QSystemTrayIcon::ActivationReason ) ) ); /* 连接信号与槽,实现单击图标恢复窗口的功能,槽是自定义的槽 */

/****初始化托盘菜单及功能****/

menu= new QMenu( this ); /* 初始化菜单 */

reset= new QAction( this ); /* 初始化恢复窗口 */

reset->setText( "显示窗口" );

QObject::connect( reset, SIGNAL( triggered() ), this, SLOT( showNormal() ) ); /* 菜单中的显示窗口,单击连接显示窗口 */

quit = new QAction( this ); /* 初始化退出程序 */

quit->setText( "退出程序" );

QObject::connect( quit, SIGNAL( triggered() ), qApp, SLOT( quit() ) ); /* 菜单中的退出程序,单击连接退出 */

/*

* qApp,是Qt自带的demo中的知识点,查了一下文档,qApp是Qt中所有app的指针,关闭它就可以关闭当前的程序

* 之所以不用this,close(),是由于软件要求关闭改为最小化到托盘,所以close()的功能已经不再是关闭窗口的功能,所以要另寻方法

* 将定义好的菜单加入托盘的菜单模块中

*/

tray->setContextMenu( menu );

menu->addAction( reset );

menu->addAction( quit );

}

/* ***重置关闭close()*** */

void MWin::closeEvent( QCloseEvent *event )

{

hide(); /* 隐藏窗口 */

event->ignore(); /* 忽略关闭事件 */

}

/*

* 因为实现的是关闭窗口至系统托盘,所以我们先将窗口hide()隐藏,再忽略关闭窗口功能event->ignore()即可。

* ***托盘图标槽***

*/

void MWin::TrayIconAction( QSystemTrayIcon::ActivationReason reason )

/* 参数是Qt的保留字,表示对托盘图标的操作,该槽函数功能只实现了单击功能,可以实现其他功能比如双击、中击,具体可查文档或者Qt自带demo(关键字tray) */

{

if ( reason == QSystemTrayIcon::Trigger )

this->showNormal(); /* 如果对图标进行单击,则显示正常大小的窗口 */

}

主函数调用测试main.cpp

#include

#include "mwin.h"

int main(int argc,char *argv[])

{

QApplication app(argc,argv);

//***三行编码设置,保证中文字符***

//本机电脑是UTF-8编码,其他电脑自行调试修改编码

QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));

QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));

QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));

MWin *win=new MWin();

win->show();

return app.exec();

}

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值