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

 

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

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

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

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

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

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

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

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

 

头文件mwin.h

#ifndef MWIN_H
#define MWIN_H
 
#include <QWidget>
#include <QtGui>
 
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() ) );                                                                                  /* 菜单中的退出程序,单击连接退出</span> */
	
	/*
	 * 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 <QtGui>
#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();
}

 

附上作者原文地址:https://blog.csdn.net/shihoongbo/article/details/38532771

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Qt 为我们提供了一种简单的方法,可以在应用程序启动时将其最小化到系统托盘中。 首先,我们需要在项目中包含 `<QSystemTrayIcon>` 头文件。接下来,在创建 `QApplication` 实例之前,我们可以设置一个标志位以指示应用程序将被最小化托盘。 例如,我们可以在 `main.cpp` 文件中添加以下代码: ```c++ #include <QApplication> #include <QSystemTrayIcon> int main(int argc, char *argv[]) { QApplication a(argc, argv); // 设置标志位以指示应用程序将被最小化托盘 bool startMinimizedToTray = true; // 创建托盘图标 QSystemTrayIcon *trayIcon = new QSystemTrayIcon(QIcon("icon.png")); // 将应用程序最小化到系统托盘中 if (startMinimizedToTray) { a.setWindowIcon(QIcon("icon.png")); trayIcon->show(); } // 其他应用程序逻辑 return a.exec(); } ``` 在上述代码中,我们首先设置了一个 `startMinimizedToTray` 标志位,用于指示应用程序是否将被最小化托盘。然后,我们创建了一个 `QSystemTrayIcon` 对象并设置了一个应用程序图标(在此例中,我们假设有一个名为 "icon.png" 的图标文件)。最后,如果 `startMinimizedToTray` 标志位为真,则将应用程序的图标显示在系统托盘中。 这样,当我们运行应用程序时,它将首先在系统托盘中显示图标,而不是在任务栏中。用户可以通过单击托盘图标来恢复应用程序的正常窗口。 ### 回答2: Qt是一个跨平台的应用程序框架,可以用于开发图形用户界面(GUI)程序。启动最小化托盘是一种常见的功能,允许程序在启动时最小化到任务栏的系统托盘区域。 要实现这个功能,首先需要引入QSystemTrayIcon类,这个类提供了操作系统托盘的接口。然后在程序的主窗口中创建一个QSystemTrayIcon对象。 接下来,可以使用hide()函数将主窗口隐藏,并使用showMinimized()函数将窗口小化。然后,调用setContextMenu()函数,为托盘图标设置一个菜单,可以在用户右键单击托盘图标时显示。菜单可以包含恢复窗口、退出程序等选项。 在程序的槽函数中,可以监听相关的事件,如托盘图标被双击、菜单项被点击等。当用户双击托盘图标时,可以调用showNormal()函数将窗口恢复正常显示。当用户选择退出程序时,可以调用QApplication的quit()函数退出程序。其他的一些槽函数可以根据需要来定义。 最后,在程序的main函数中实例化QApplication对象,并将程序的主窗口作为参数传递给QSystemTrayIcon的构造函数。然后,调用show()函数显示主窗口。 通过以上的步骤,程序在启动时会先最小化到系统托盘区域,用户可以通过托盘图标进行操作。这样做的好处是不会占用用户的任务栏空间,而且用户可以随时将窗口恢复显示,方便快捷。 ### 回答3: 要在Qt中实现将应用程序启动最小化到系统托盘,可以按照以下步骤进行操作: 1. 首先,需要在应用程序中添加`QSystemTrayIcon`类的实例,该类提供了访问系统托盘图标的功能。可以在应用程序的主窗口类中添加一个成员变量来保存`QSystemTrayIcon`对象。 2. 创建一个菜单,用于点击托盘图标时显示的菜单项。可以使用`QMenu`和`QAction`类来创建并添加菜单项。 3. 接下来,在应用程序的`main()`函数中,需要检查当前操作系统是否支持系统托盘功能。如果不支持,则不进行后续操作。 4. 当应用程序窗口关闭时,需要将其最小化到系统托盘。可以通过重写应用程序类的`closeEvent()`函数来实现。在该函数中,需要将主窗口隐藏,并设置`QSystemTrayIcon`对象的图标和菜单。 5. 最后,在`QSystemTrayIcon`的槽函数中处理托盘图标的点击事件。可以根据具体需求来实现不同的功能,比如恢复应用程序窗口、退出应用程序等。 需要注意的是,启动最小化到系统托盘功能在不同平台上的实现方式可能有所不同。因此,在进行具体实现时,需要根据目标平台和Qt版本选择适当的方法和事件。 以上是实现在Qt中将应用程序启动最小化到系统托盘的一般步骤。具体的实现方式还需要根据应用程序的具体需求和平台特性进行调整。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值