第2课:Qt5创建托盘程序

安装好了QT是不是想大试身手,开发个客户端?那我们第一个客户端什么样子好呢?突然看到自己电脑右下角的QQ在闪烁,嗯,做个托盘程序吧

要实现的效果就是像QQ一样,打开之后在电脑右下角出现一个图标,并且这个图标可以增加菜单,进行一系列的操作

1.新建Qt Widgets Application项目,其实这个就是GUI应用
2.建好项目之后,会发现已经给你生成好了文件
包括:
头文件 mainwindow.h
源文件 main.cpp  mainwindow.cpp
界面文件 mainwindow.ui
如果你想用拖拽的方式生成界面,可以直接修改界面文件
如果写源码,可以编辑源文件

下面以代码为例:
[1]mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QSystemTrayIcon>
#include <QMenu>
#include <QCloseEvent>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
private:
  Ui::MainWindow *ui;
private slots:
  void on_action_quit_triggered();
  void onSystemTrayIconClicked(QSystemTrayIcon::ActivationReason reason);
protected:
  void closeEvent(QCloseEvent *event);
private:
    QSystemTrayIcon *trayicon;
    QMenu *trayiconMenu;

    QAction *minimizeAction;
    QAction *restoreAction;
    QAction *quitAction;
};

#endif // MAINWINDOW_H

[2]main.cpp
//main.cpp
#include <QtWidgets/QApplication>
#include "mainwindow.h"
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    QObject::connect(&w,SIGNAL(exitsignal()),&a,SLOT(quit()));//将退出按钮与退出函数绑定
    return a.exec();
}

[3]mainwindow.cpp
//mainwindow.cpp
#include <QtWidgets/QApplication>
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
  QMainWindow(parent),
  ui(new Ui::MainWindow)
{
  ui->setupUi(this);
  trayicon = new QSystemTrayIcon(this);
  //创建QIcon对象,参数是图标资源,值为项目的资源文件中图标的地址
  QIcon icon("D:/Qt/code/desktop/img/favicon.ico");
  trayiconMenu = new QMenu(this);

  minimizeAction = new QAction(tr("最小化 (&I)"), this);
  connect(minimizeAction, SIGNAL(triggered()), this, SLOT(hide()));
  restoreAction = new QAction(tr("还原 (&R)"), this);
  connect(restoreAction, SIGNAL(triggered()), this, SLOT(showNormal()));
  quitAction = new QAction(tr("退出 (&Q)"), this);
  connect(quitAction, SIGNAL(triggered()), qApp, SLOT(quit()));

  //为托盘菜单添加菜单项
  trayiconMenu->addAction(minimizeAction);
  trayiconMenu->addAction(restoreAction);
  trayiconMenu->addAction(quitAction);

  //为托盘菜单添加分隔符
  trayiconMenu->addSeparator();
  //将创建的QIcon对象作为系统托盘图标
  trayicon->setIcon(icon);
  //显示托盘图标
  trayicon->show();
  //设置系统托盘提示
  trayicon->setToolTip(tr("托盘测试"));
  //将创建菜单作为系统托盘菜单
  trayicon->setContextMenu(trayiconMenu);
  //在系统托盘显示气泡消息提示
  trayicon->showMessage(tr("hahaya"), tr("托盘测试"), QSystemTrayIcon::Information, 5000);
  //为系统托盘绑定单击信号的槽 即图标激活时
  connect(trayicon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(onSystemTrayIconClicked(QSystemTrayIcon::ActivationReason)));
}
MainWindow::~MainWindow()
{
  delete ui;
}
void MainWindow::onSystemTrayIconClicked(QSystemTrayIcon::ActivationReason reason)
{
  switch(reason)
  {
  //单击
  case QSystemTrayIcon::Trigger:
  //双击
  case QSystemTrayIcon::DoubleClick:
      //恢复窗口显示
      this->setWindowState(Qt::WindowActive);
      this->show();
      break;
  default:
      break;
  }
}
void MainWindow::closeEvent(QCloseEvent *event)
{
  if(trayicon->isVisible())
  {
      hide();
      event->ignore();
  }
}
void MainWindow::on_action_quit_triggered()
{
  this->hide();
  this->close();
}

3.编译代码,查看效果

打赏  如对你有帮助,请我喝杯咖啡吧!