qt 最小化托盤 菜單互斥

///////////main.cpp////////////////

#include "mainwindow.h"
#include "spriteapplication.h"

int main(int argc, char *argv[]) {
    SpriteApplication a(argc, argv);
    MainWindow w;
    w.onInit(&a);

    return a.exec();
}
//////////////////////////////////////////////////////

@@@@@@@mainwindow.h  mainwindow.cpp@@@@@@@

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QSystemTrayIcon>
#include "traymenu.h"
#include "spriteapplication.h"

class MainWindow : public QMainWindow {
    Q_OBJECT

public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();


private:
    void onInitTray();


private:
    TrayMenu *tray_menu;
    SpriteApplication* app;

public slots:
    void iconIsActived(QSystemTrayIcon::ActivationReason reason);
    void onTrayMenuSelected(QString itemId);

public:
    void onInit(SpriteApplication* app);

};

#endif // MAINWINDOW_H


--------------------------------------

#include "mainwindow.h"
#include "QSystemTrayIcon"
#include "qdebug.h"
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent) {
    onInitTray();
}
MainWindow::~MainWindow(){
}
void MainWindow::onInit(SpriteApplication* app){
    this->app = app;
}
void MainWindow::onInitTray()
{
    QSystemTrayIcon *system_tray = new QSystemTrayIcon();
    //放在托盤提示信息、托盤圖標
    system_tray ->setToolTip(tr("傳屏精靈"));
    system_tray->setIcon(QIcon(":/new/prefix/asset/tray.png"));
    tray_menu = new TrayMenu();
    system_tray->setContextMenu(tray_menu);
    connect(tray_menu,SIGNAL(trayMenuSelected(QString)),this,SLOT(onTrayMenuSelected(QString)));
    //點擊托盤執行的事件
    QObject::connect(system_tray,SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this,SLOT(iconIsActived(QSystemTrayIcon::ActivationReason)));
    //顯示托盤
    system_tray->show();
    //托盤顯示提示信息
    system_tray->showMessage(QString("傳屏精靈"),QString("傳屏服務"));
}
void MainWindow::iconIsActived(QSystemTrayIcon::ActivationReason reason)
{
    switch(reason)
    {
        //點擊托盤顯示窗口
        case QSystemTrayIcon::Trigger:
            tray_menu->exec( QPoint( QCursor::pos().rx(),  QCursor::pos().ry() + 2 ));
            break;
        //雙擊托盤顯示窗口
        case QSystemTrayIcon::DoubleClick:
            //tray_menu->exec(QCursor::pos());
            break;
        default:
            break;
    }
}
void MainWindow::onTrayMenuSelected(QString itemId){
    qDebug()<<itemId;
    if(itemId == "ID_TRAYMENU_EXIT")
        app->quit();
}


@@@@@@@

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!spriteapplication.h  spriteapplication.cpp!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

#ifndef SPRITEAPPLICATION_H
#define SPRITEAPPLICATION_H

#include <QObject>
#include <QApplication>

class SpriteApplication : public QApplication {
    Q_OBJECT
public:
    SpriteApplication(int &argc, char **argv);
};

#endif // SPRITEAPPLICATION_H
-----------------------------
#include "spriteapplication.h"
SpriteApplication::SpriteApplication(int &argc, char **argv)
    : QApplication(argc, argv){
}

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!





%%%%%%%%%%%%%%%%%   traymenu.h     traymenu.cpp  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

#ifndef TRAYMENU_H
#define TRAYMENU_H
#include "qmenu.h"
class TrayMenu : public QMenu {
    Q_OBJECT
public:
    TrayMenu();
private:
    QAction* m_pActionHigh;
    QAction* m_pActionNormal;
    QAction* m_pActionLow;
    QActionGroup* m_pActionGQGroup;
    QAction* m_pActionExit;
private:
    void createActions();
private slots:
    void onTriggered(QAction* action);
    void onExit();
signals:
    void trayMenuSelected(QString id);
};
#endif // TRAYMENU_H

#include "traymenu.h"
TrayMenu::TrayMenu()
    : QMenu() {
    createActions();
}
void TrayMenu::createActions() {
    m_pActionHigh = new QAction(this);
    m_pActionNormal = new QAction(this);
    m_pActionLow = new QAction(this);
    m_pActionExit = new QAction(this);
    m_pActionHigh->setCheckable( true );
    m_pActionNormal->setCheckable( true );
    m_pActionLow->setCheckable( true );
    m_pActionHigh->setText(QString("高清"));
    m_pActionNormal->setText(QString("普通"));
    m_pActionLow->setText(QString("高速"));
    m_pActionExit->setText(QString("退出"));
    connect(m_pActionExit, SIGNAL(triggered()), this, SLOT(onExit()));
    //添加菜單項
    this->addAction(m_pActionHigh);
    this->addAction(m_pActionNormal);
    this->addAction(m_pActionLow);
    this->addSeparator();
    this->addAction(m_pActionExit);
    m_pActionGQGroup = new QActionGroup(this);
    m_pActionGQGroup->addAction(m_pActionHigh);
    m_pActionGQGroup->addAction(m_pActionNormal);
    m_pActionGQGroup->addAction(m_pActionLow);
    connect(m_pActionGQGroup, SIGNAL(triggered(QAction*)),this,SLOT(onTriggered(QAction*)));
}
void TrayMenu::onTriggered(QAction* action) {
    if(action == m_pActionHigh)
        emit(trayMenuSelected("ID_TRAYMENU_HIGH"));
    else if(action == m_pActionNormal)
        emit(trayMenuSelected("ID_TRAYMENU_NORMAL"));
    else if(action == m_pActionLow)
        emit(trayMenuSelected("ID_TRAYMENU_LOW"));
    else if(action == m_pActionExit)
        emit(trayMenuSelected("ID_TRAYMENU_EXIT"));
}
void TrayMenu::onExit() {
    emit(trayMenuSelected("ID_TRAYMENU_EXIT"));
}

 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
.pro
#-------------------------------------------------
#
# Project created by QtCreator 2016-05-04T21:08:29
#
#-------------------------------------------------
QT       += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = ScreenSharingSprite
TEMPLATE = app
SOURCES += main.cpp\
    traymenu.cpp \
    mainwindow.cpp \
    spriteapplication.cpp \
    spritecontroller.cpp
HEADERS  += \
    mainwindow.h \
    traymenu.h \
    spriteapplication.h \
    spritecontroller.h
RESOURCES += \
    asset.qrc






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章