QSystemTrayIcon使用,dock和工具栏上icon点击

1. 在.cpp中引入头
#include <QSystemTrayIcon>
#ifdef Q_OS_MAC
#include <objc/objc.h>
#include <objc/message.h>
void setupDockClickEvent(); // mac端点击dock用到的方法
bool applicationShouldHandleReopen(id self,SEL _cmd,...);
#endif
2. Swizzling在mac端替换系统方法,监控mac端dock按钮点击
#ifdef Q_OS_MAC
bool applicationShouldHandleReopen(id self,SEL _cmd, ...)
{
    // 点击dock按钮时调用方法
    action_showMain();
    return false;
}
#endif

#ifdef Q_OS_MAC
void setupDockClickEvent()
{

    Class cls = objc_getClass("NSApplication");
    id appInstance = objc_msgSend(cls, sel_registerName("sharedApplication"));

    if(appInstance != nullptr)
    {
        id appDelegate = objc_msgSend(appInstance, sel_registerName("delegate"));
        Class delClass = objc_msgSend(appDelegate,  sel_registerName("class"));

        SEL shouldHandle = sel_registerName("applicationShouldHandleReopen:hasVisibleWindows:");
        if (class_getInstanceMethod(delClass, shouldHandle))
        {

            // 使用Swizzling黑魔法替换 applicationShouldHandleReopen:hasVisibleWindows: 系统方法
            if (class_replaceMethod(delClass, shouldHandle,  reinterpret_cast<IMP>(applicationShouldHandleReopen), "B@:"))
                qDebug() << "方法替换成功";
            else
                qDebug() << "方法替换失败";
        }
        else
        {
            if (class_addMethod(delClass, shouldHandle, reinterpret_cast<IMP>(applicationShouldHandleReopen),"B@:"))
                qDebug() << "添加dock点击方法成功";
            else
                qDebug() << "添加dock点击方法成功失败";
        }
    }
}
#endif
3. 添加QSystemTrayIcon
	trayicon = new QSystemTrayIcon(this);
    trayicon->setToolTip("垣连");

#if defined(Q_OS_WIN)
	// 只有windows端添加只有右击菜单,mac端单击就显示这个菜单,与单击展示页面冲突,丑,不加
    trayicon->setIcon(QIcon(":/icon/images/icon.png")); // windows的icon画布正方形
    trayMenu = new TrayIconMenu();
    QAction *main_action = new QAction(tr("打开主屏幕"),this);
    QAction *exit_action = new QAction(tr("退出"),this);

    QObject::connect(main_action,SIGNAL(triggered()),this,SLOT(action_showMain()));
    QObject::connect(exit_action,SIGNAL(triggered()),this,SLOT(action_exit()));

    trayMenu->addAction(exit_action);
    trayMenu->addAction(main_action);

    trayicon->setContextMenu(trayMenu);

#elif defined(Q_OS_MACOS)
    setupDockClickEvent(); // 进行dock方法替换
    trayicon->setIcon(QIcon(":/icon/images/icon_mac.png")); // mac的icon画布长方形,不然会显得icon很大
#endif
	QObject::connect(trayicon,SIGNAL(activated(QSystemTrayIcon::ActivationReason)),this,SLOT(iconActived(QSystemTrayIcon::ActivationReason)));
    trayicon->show();
4. 点击dock按钮和头部icon将页面展示在最前边
// 打开主页面
void action_showMain()
{
    if (this->isMinimized()) this->showNormal();
    if (this->isHidden()) this->show();
    this->setWindowState(Qt::WindowActive);
    this->raise(); // mac端将窗口放在最前边
    this->activateWindow(); // windows端将窗口放在最前边,两端还不一样

}

// 退出app
void action_exit()
{
    qApp->quit();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值