Qt实现程序最小化后从任务栏转到右下角托盘,请给我程序完整代码
时间: 2023-09-24 08:10:29 浏览: 129
Qt实现最小化到托盘任务栏-完整工程代码.zip
5星 · 资源好评率100%
### 回答1:
下面是一个使用Qt实现程序最小化后从任务栏转到右下角托盘的完整代码示例:
mainwindow.h 文件:
```c++
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QSystemTrayIcon>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
QSystemTrayIcon *trayIcon; // 系统托盘图标
QAction *minimizeAction; // 最小化到托盘的动作
QAction *restoreAction; // 从托盘还原的动作
QAction *quitAction; // 退出程序的动作
void createActions(); // 创建动作的函数
void createTrayIcon(); // 创建托盘图标的函数
void changeEvent(QEvent *event); // 窗口状态改变事件
private slots:
void iconActivated(QSystemTrayIcon::ActivationReason reason); // 托盘图标激活事件
};
#endif // MAINWINDOW_H
```
mainwindow.cpp 文件:
```c++
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMenu>
#include <QMessageBox>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
// 创建动作和托盘图标
createActions();
createTrayIcon();
// 将窗口隐藏到任务栏右下角
this->hide();
}
MainWindow::~MainWindow()
{
}
void MainWindow::createActions()
{
// 最小化到托盘的动作
minimizeAction = new QAction(tr("最小化(&N)"), this);
connect(minimizeAction, &QAction::triggered, this, &MainWindow::hide);
// 从托盘还原的动作
restoreAction = new QAction(tr("还原(&R)"), this);
connect(restoreAction, &QAction::triggered, this, &MainWindow::showNormal);
// 退出程序的动作
quitAction = new QAction(tr("退出(&Q)"), this);
connect(quitAction, &QAction::triggered, qApp, &QApplication::quit);
}
void MainWindow::createTrayIcon()
{
// 创建系统托盘图标
trayIcon = new QSystemTrayIcon(this);
trayIcon->setIcon(QIcon(":/images/icon.png"));
// 创建右键菜单
QMenu *trayIconMenu = new QMenu(this);
trayIconMenu->addAction(minimizeAction);
trayIconMenu->addAction(restoreAction);
trayIconMenu->addSeparator();
trayIconMenu->addAction(quitAction);
// 设置托盘图标的右键菜单
trayIcon->setContextMenu(trayIconMenu);
// 显示托盘图标
trayIcon->show();
// 监听托盘图标激活事件
connect(trayIcon, &QSystemTrayIcon::activated, this, &MainWindow::iconActivated);
}
void MainWindow::changeEvent(QEvent *event)
{
// 窗口状态改变事件
if (event->type() == QEvent::WindowStateChange) {
if (isMinimized()) {
// 如果窗口被最小化,隐藏到托盘
this->hide();
}
}
}
void MainWindow::iconActivated(QSystemTrayIcon::ActivationReason reason)
{
// 托盘图标激活事件
switch (reason) {
case QSystemTrayIcon::Trigger:
case QSystemTrayIcon::DoubleClick:
// 鼠标单击或双击托盘图标,显示窗口
this->showNormal();
break;
default:
// 其他事件,不处理
break;
}
}
```
在以上代码中,我们首先创建了一个 `QSystemTrayIcon` 对象,作为系统托盘图标。然后,我们在 `createActions()` 函数中创建了最小化到托盘、从托盘还原和退出程序三个动作,并在 `createTrayIcon()` 函数中将这些动作添加到托盘图标的右键菜单中。同时,我们还监听了 `QSystemTrayIcon::activated` 信号,当用户单击或双击托盘图标时,显示窗口。
在 `changeEvent()` 函数中,我们监听了窗口状态改变事件,如果窗口被最小化,就将其隐藏到托盘。这样,当用户单击窗口的最小化按钮时,窗口会被隐藏到托盘,而不是任务栏。
最后,我们在 `iconActivated()` 函数中处理托盘图标的激活事件,如果用户单击或双击托盘图标,就显示窗口。
### 回答2:
的确,可以使用Qt来实现程序最小化后从任务栏转到右下角托盘。下面是一个简单的示例程序的完整代码:
```cpp
#include <QtWidgets>
class MyWindow : public QMainWindow
{
Q_OBJECT
public:
MyWindow(QWidget *parent = nullptr)
: QMainWindow(parent)
{
createTrayIcon();
}
protected:
void changeEvent(QEvent *event) override
{
if (event->type() == QEvent::WindowStateChange) {
if (isMinimized()) {
hide(); // 窗口最小化时隐藏窗口
}
else {
show(); // 窗口从最小化还原时显示窗口
}
}
QMainWindow::changeEvent(event);
}
private:
void createTrayIcon()
{
trayIconMenu = new QMenu(this);
QAction *restoreAction = trayIconMenu->addAction("还原");
connect(restoreAction, &QAction::triggered, this, &MyWindow::restoreWindow);
QAction *quitAction = trayIconMenu->addAction("退出");
connect(quitAction, &QAction::triggered, qApp, &QCoreApplication::quit);
trayIcon = new QSystemTrayIcon(this);
trayIcon->setIcon(QIcon(":/icons/icon.png"));
trayIcon->setContextMenu(trayIconMenu);
trayIcon->show();
}
void restoreWindow()
{
showNormal(); // 还原窗口
activateWindow(); // 激活窗口
}
private:
QSystemTrayIcon *trayIcon;
QMenu *trayIconMenu;
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MyWindow w;
w.show();
return a.exec();
}
#include "main.moc"
```
需要在代码中创建一个`QSystemTrayIcon`对象并将其相关的菜单项连接到槽函数,在窗口最小化时调用`hide()`方法隐藏窗口,在托盘菜单中点击“还原”时调用`showNormal()`方法还原窗口。
需要注意的是,在使用上述代码时,需要为程序添加一个显示图标(例如`icon.png`)的资源文件。关于如何创建和使用资源文件,请参考Qt的官方文档。
### 回答3:
以下是一个简单的使用Qt实现程序最小化后从任务栏转到右下角托盘的完整代码示例:
```cpp
#include <QApplication>
#include <QSystemTrayIcon>
#include <QMenu>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
// 创建系统托盘图标
QSystemTrayIcon* trayIcon = new QSystemTrayIcon();
trayIcon->setIcon(QIcon(":/icon.png"));
// 创建托盘图标菜单
QMenu* trayMenu = new QMenu();
QAction* showAction = new QAction("显示窗口", trayMenu);
QAction* quitAction = new QAction("退出程序", trayMenu);
trayMenu->addAction(showAction);
trayMenu->addAction(quitAction);
// 将菜单与托盘图标绑定
trayIcon->setContextMenu(trayMenu);
// 最小化时隐藏窗口,并在系统托盘显示图标
QObject::connect(app, &QApplication::windowIconified, [trayIcon](bool iconified){
if (iconified) {
trayIcon->show();
}
});
// 显示窗口时,从系统托盘隐藏图标
QObject::connect(showAction, &QAction::triggered, [trayIcon](){
trayIcon->hide();
// 这里可以添加窗口的显示逻辑
});
// 退出程序时销毁托盘图标
QObject::connect(quitAction, &QAction::triggered, [&app, trayIcon](){
trayIcon->hide();
delete trayIcon;
app.quit();
});
return app.exec();
}
```
请替换其中的`:/icon.png`为您自己的图标文件路径。这个例子中,当程序最小化时,会隐藏窗口并将图标显示在系统托盘中。点击托盘图标,会弹出菜单,其中包括“显示窗口”和“退出程序”两个选项。点击“显示窗口”后,窗口会显示,托盘图标会隐藏;点击“退出程序”后,程序会退出并销毁托盘图标。
阅读全文