Qt implementa la bandeja del sistema QSystemTrayIcon

Entorno de desarrollo: ubuntu16.04 + Qt5.6.3

Información oficial: https://doc.qt.io/qt-5/desktop-integration.html

QSystemTrayIcon

La clase QSystemTrayIcon proporciona un icono para la aplicación en la bandeja del sistema.

Los sistemas operativos modernos suelen proporcionar un área especial en el escritorio denominada bandeja del sistema o área de notificación. Las aplicaciones de larga ejecución pueden mostrar iconos y mensajes cortos.

QDesktopServices

Las funciones proporcionadas por la clase QDesktopServices se utilizan para acceder a servicios de escritorio comunes.

Muchos entornos de escritorio proporcionan una serie de servicios que pueden realizar tareas comunes a través de aplicaciones. No solo puede abrir un navegador local, sino que también puede abrir archivos locales (carpetas), etc., y puede obtener directorios como escritorio y Inicio.


Ejemplo

La función principal:

  • Cerrar la última ventana sin salir del programa
  • Visualización del menú de la bandeja: acerca de, registrar, abrir, salir de cuatro menús
  • Acerca de: abre el cuadro de diálogo Acerca de
  • Registro: Ver registro
  • Abrir: abre la interfaz principal
  • Salir: salir del programa
  • Página principal: haga clic en el botón de conexión, encendido, inicio de sesión, etc., y el mensaje de la bandeja muestra información de solicitud 

resultado de ejecución:

Código fuente:

Estructura de código:

├── icono

│ ├── about.png

│ ├── icon.png

│ └── RR1582 * 1327.png

├── image.qrc

├── main.cpp

├── mainwindow.cpp

├── mainwindow.h

├── mainwindow.ui

├── MockMiTalk.pro

└── MockMiTalk.pro.user

Código de núcleo:

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QDateTime>
#include <QDesktopWidget>
#include <QMessageBox>


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    setWindowTitle("桌面集成C++版本");
    setWindowIcon(QIcon(":/icon/RR1582*1327.png"));

    logAction = new QAction(tr("日志"), this);
    logAction->setIcon(QIcon::fromTheme("document-new"));
    aboutAction = new QAction(tr("关于"), this);
    aboutAction->setIcon(QIcon::fromTheme("help-about"));
    openAction = new QAction(tr("打开"), this);
    openAction->setIcon(QIcon::fromTheme("media-record"));
    quitAction = new QAction(tr("退出"), this);
    quitAction->setIcon(QIcon::fromTheme("application-exit"));  //从系统主题获取图标

    trayIconMenu = new QMenu(this);
    trayIconMenu->addAction(aboutAction);
    trayIconMenu->addAction(logAction);

    trayIconMenu->addSeparator();
    trayIconMenu->addAction(openAction);
    trayIconMenu->addAction(quitAction);

    trayIcon = new QSystemTrayIcon(this);
    trayIcon->setContextMenu(trayIconMenu);
    trayIcon->setIcon(QIcon(":/icon/icon.png"));
    trayIcon->setToolTip(QString::fromLocal8Bit("RRRC"));
    trayIcon->show();

    connect(openAction, &QAction::triggered, this, &QWidget::showNormal);
    connect(quitAction, &QAction::triggered, qApp, &QCoreApplication::quit);
    connect(aboutAction, SIGNAL(triggered(bool)), this, SLOT(showAbout()));
    connect(logAction, &QAction::triggered, [=](){
          QDesktopServices::openUrl(QUrl(log_path));
    });
    //居中
    QDesktopWidget* desktop = QApplication::desktop();
    int current_screen = desktop->screenNumber(this); //获取程序所在屏幕是第几个屏幕
    QRect rect = desktop->screenGeometry(current_screen); //获取程序所在屏幕的尺寸
    this->move((rect.width() - this->width())/2,(rect.height() - this->height())/2);

    //日志
    QDateTime currentDateTime = QDateTime::currentDateTime();
    QString log = currentDateTime.toString("yyyy/MM/dd HH:mm:ss") + "\n";
    log_path = QApplication::applicationDirPath() + "/log.txt";
    QFile file(log_path);
    if (file.open(QFile::WriteOnly)) {
        file.write(log.toUtf8());
        file.close();
    }
}

MainWindow::~MainWindow()
{
    delete ui;

}

void MainWindow::closeEvent(QCloseEvent *event)
{
    if (trayIcon->isVisible()) {
        QMessageBox::information(this, tr("系统托盘"),
                                 tr("程序将继续在系统托盘中运行。要终止该程序,请在系统托盘条目的上下文菜单中选择[退出]。"));
        //不退出App
        hide();
        event->ignore();
    }
}

void MainWindow::showAbout()
{
    QMessageBox MB(this);
    MB.setWindowTitle("关于");
    MB.setText("桌面集成C++实现\n\n Copyright © 2020-2020 JUN. \nAll Rights Reserved. ");
    MB.setButtonText (QMessageBox::Ok,QString("确 定"));
    MB.setIconPixmap(QPixmap(":/icon/icon.png"));
    MB.exec();
}


void MainWindow::on_connectBtn_clicked()
{
    showMessage("连接", "已经连接机械手");
}

void MainWindow::on_powerBtn_clicked()
{
    showMessage("上电", "机械手已上电");
}

void MainWindow::on_loginBtn_clicked()
{
    showMessage("权限", "切换权限USER1");
}


void MainWindow::showMessage(QString title, QString content)
{
    //显示消息,1s后自动消失
    //第一个参数是标题
    //第二个参数是消息内容
    //第三个参数图标
    //第四个参数是超时毫秒数
    trayIcon->showMessage(title,content,QSystemTrayIcon::Information,1000);
}

main.cpp

#include "mainwindow.h"
#include <QApplication>
#include <QMessageBox>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    if (!QSystemTrayIcon::isSystemTrayAvailable()) {
        QMessageBox::critical(0, QObject::tr("系统托盘"),
                              QObject::tr("本机系统上检测不到任何系统托盘"));
        return 1;
    }
    QApplication::setQuitOnLastWindowClosed(false);  //关闭最后一个窗口不退出程序
    MainWindow w;
    w.show();
//    MainWindow *mainWindow = new MainWindow;
//    Q_UNUSED(mainWindow);
    return a.exec();
}

 

 

 

 

 

Supongo que te gusta

Origin blog.csdn.net/qq_40602000/article/details/109275933
Recomendado
Clasificación