Qt for Mac阻止MacOS系统休眠

Qt开发的应用程序如果电脑休眠了会影响软件的使用,因此在软件的使用过程中需要防止电脑休眠,在Win上有专门的API进行处理,在Mac上也必需使用Mac平台自身的API,本篇介绍在Mac平台下使用Qt阻止Mac系统休眠。

要调用Mac系统的API,得需要添加Object- C的语言文件,这里得创建两个文件mactools.h和 mactools.mm的文件

在工程文件中添加Mac的库

mac:{
#    DEFINES += PRODUCT
    LIBS += -framework IOKit
    LIBS += -framework CoreFoundation

    OBJECTIVE_SOURCES += mactools.mm
    OBJECTIVE_HEADERS += mactools.h
    #程序图标
#    ICON = logo.icns
    VERSION = 2.0.1.1
}

休眠功能代码:

//官方例子用的文字说明
CFStringRef reasonForActivity = CFSTR("QtforMac App");
IOReturn success = IOPMAssertionCreateWithName(kIOPMAssertionTypeNoDisplaySleep, kIOPMAssertionLevelOn, reasonForActivity, &assertionID);

软件退出后,得还电脑原休眠状态

IOReturn success = IOPMAssertionRelease(assertionID);

完整的代码如下:

QtPreventSystemSleep.pro

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++11

# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0
#mac环境配置
mac:{
#    DEFINES += PRODUCT
    LIBS += -framework IOKit
    LIBS += -framework CoreFoundation

    OBJECTIVE_SOURCES += mactools.mm
    OBJECTIVE_HEADERS += mactools.h
    #程序图标
#    ICON = logo.icns
    VERSION = 2.0.1.1
}

SOURCES += \
    main.cpp \
    dialog.cpp

HEADERS += \
    dialog.h

FORMS += \
    dialog.ui


# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

mactools.h

#ifndef MACTOOLS_H
#define MACTOOLS_H

/*
 * brief: Mac系统阻止休眠
 * author:chenyijun
 * date:  2024-03-17
 */

class MacTools {
public:
    bool preventSleep();
    bool recoverSleep();

private:
    bool isPrevent{false};
};

#endif // MACTOOLS_H

mactools.cpp文件

#include "mactools.h"
#import <CoreFoundation/CoreFoundation.h>  //mac头文件
#import <IOKit/pwr_mgt/IOPMLib.h>            //mac头文件
#include <QDebug>
#include <QDateTime>

#define PRINTTIME QDateTime::currentDateTime().toString("yyyy.MM.dd hh:mm:ss.zzz");


IOPMAssertionID assertionID;

bool MacTools::preventSleep()
{
    //限制不重复执行
    if(isPrevent)
        return true;

    //官方例子用的文字说明
    CFStringRef reasonForActivity = CFSTR("AtomStack Studio");
    IOReturn success = IOPMAssertionCreateWithName(kIOPMAssertionTypeNoDisplaySleep, kIOPMAssertionLevelOn, reasonForActivity, &assertionID);
    isPrevent = (success == kIOReturnSuccess);
    qDebug() << __FUNCTION__ << " isPrevent=============" << isPrevent << assertionID << PRINTTIME;
    return isPrevent;
}

bool MacTools::recoverSleep()
{
    //执行过才支持取消
    if(!isPrevent)
        return true;

    IOReturn success = IOPMAssertionRelease(assertionID);
    qDebug() << __FUNCTION__ << " isPrevent=============" << isPrevent << assertionID << PRINTTIME;
    return success == kIOReturnSuccess;
}


dialog.h

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>

class QTimer;

QT_BEGIN_NAMESPACE
namespace Ui { class Dialog; }
QT_END_NAMESPACE

class Dialog : public QDialog
{
    Q_OBJECT

public:
    Dialog(QWidget *parent = nullptr);
    ~Dialog();
    void initData();

private:
    Ui::Dialog *ui;
    QTimer *m_timer;
};
#endif // DIALOG_H

dialog.cpp

#include "dialog.h"
#include "ui_dialog.h"
#include <QTimer>
#include <QDateTime>
#include <QDebug>

//#define PRINTTIME QDateTime::currentDateTime().toString("yyyy.MM.dd hh:mm:ss.zzz");

Dialog::Dialog(QWidget *parent)
    : QDialog(parent)
    , ui(new Ui::Dialog)
{
    ui->setupUi(this);
    this->setWindowTitle("Qt for Mac 阻止系统休眠");
    initData();
}

Dialog::~Dialog()
{
    delete ui;
}

void Dialog::initData()
{
    QFont font = qApp->font();
    font.setPixelSize(20);
    ui->label->setFont(font);
    ui->label->setStyleSheet("QLabel{background-color:#0000ff;color:#FF0000;}");
    ui->label->setAlignment(Qt::AlignCenter);

    m_timer = new QTimer();
    QObject::connect(m_timer, &QTimer::timeout, [&]() {
        //QString strTime = QDateTime::currentDateTime().toString("yyyy.MM.dd hh:mm:ss");
        QString strTime = QDateTime::currentDateTime().toString("hh:mm:ss");
        ui->label->setText(strTime);
        ui->label->update();
        qDebug() << "strTime==========================" << strTime;
    });
    m_timer->start(1000);
}

main.cpp

阻止系统休眠使用代码

#include "dialog.h"

#include <QApplication>


#ifdef Q_OS_MAC
#include "mactools.h"
#endif

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
#ifdef Q_OS_MAC
    //开启阻止休眠
    MacTools macTools;
    macTools.preventSleep();
#endif

    Dialog w;
    w.show();
    int ret = a.exec();
#ifdef Q_OS_MAC
    //程序退出还原系统休眠状态
    macTools.recoverSleep();
#endif
    return ret;
}

运行:

参考:

Qt Mac阻止和启用休眠_mac休眠api-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/464840.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vulhub中GitLab 任意文件读取漏洞复现(CVE-2016-9086)

GitLab是一款Ruby开发的Git项目管理平台。在8.9版本后添加的“导出、导入项目”功能&#xff0c;因为没有处理好压缩包中的软连接&#xff0c;已登录用户可以利用这个功能读取服务器上的任意文件。 环境运行后&#xff0c;访问http://your-ip:8080即可查看GitLab主页&#xff0…

PC电脑如何使用HDMI连接小米电视当显示屏

使用HDMI连接好当时和电脑&#xff0c;HDMI2.0会更清晰&#xff1b;小米电视会自动弹窗提示你有HDMI 接口连接&#xff0c;或者你进入信号源进行选择即可&#xff1b;需要平时我们电脑的显示器正常连接&#xff0c;然后按 win p &#xff0c;选择 扩展 屏幕&#xff1b; 进入设…

27-2 文件上传漏洞 - 前端绕过

环境准备:构建完善的安全渗透测试环境:推荐工具、资源和下载链接_渗透测试靶机下载-CSDN博客 前端绕过思路 - 禁用 JavaScript: 背景: 当前开发行业大多采用前后端分离模式,后端使用多种开发语言如 PHP、Java 等,而前端主要使用 JavaScript(JS)。因此,禁用 JavaScrip…

开设新量子计算中心!IonQ 全力加速量子商业化

内容来源&#xff1a;量子前哨&#xff08;ID&#xff1a;Qforepost&#xff09; 编辑丨慕一 编译/排版丨浪味仙 沛贤 深度好文&#xff1a;1000字丨8分钟阅读 近日&#xff0c;量子计算公司IonQ对外宣布&#xff0c;将在华盛顿开设一家新量子中心。公告里还提出&#xff0c…

html5黑色大气的个人博客全屏滚动个人主页源码HTML+JS+CSS

html5黑色大气的个人博客全屏滚动个人主页源码HTMLJSCSS

软件测试 自动化测试selenium 基础篇

文章目录 1. 什么是自动化测试&#xff1f;1.1 自动化分类 2. 什么是 Selenium &#xff1f;3. 为什么使用 Selenium &#xff1f;4. Selenium 工作原理5. Selenium 环境搭建 1. 什么是自动化测试&#xff1f; 将人工要做的测试工作进行转换&#xff0c;让代码去执行测试工作 …

【Frida】04_Frida中使用TypeScript脚本(采坑)

▒ 目录 ▒ &#x1f6eb; 导读需求开发环境演示目标 1️⃣ 操作步骤安装node 20.10.0在 VSCode 中打开项目目录初始化一个 NodeJS 项目安装 TypeScript初始化 TypeScript 项目安装依赖配置 TypeScript编写代码编译设置编译脚本运行&#xff0c;查看结果 2️⃣ 采坑frida-compi…

旧华硕电脑开机非常慢 电脑开机黑屏很久才显示品牌logo导致整体开机速度非常的慢怎么办

前提条件 电池需要20&#xff05;&#xff08;就是电池没有报废&#xff09;且电脑接好电源&#xff0c;千万别断电&#xff0c;电脑会变成砖头的 解决办法 更新bios即可解决&#xff0c;去对应品牌官网下载最新的bios版本就行了 网上都是一些更新驱动啊

深度学习 精选笔记(12)卷积神经网络-理论基础1

学习参考&#xff1a; 动手学深度学习2.0Deep-Learning-with-TensorFlow-bookpytorchlightning ①如有冒犯、请联系侵删。 ②已写完的笔记文章会不定时一直修订修改(删、改、增)&#xff0c;以达到集多方教程的精华于一文的目的。 ③非常推荐上面&#xff08;学习参考&#x…

JS原型和原型链的理解

原型链图&#xff0c;图中Parent是构造函数&#xff0c;p1是通过Parent实例化出来的一个对象 前置知识 js中对象和函数的关系&#xff0c;函数其实是对象的一种 函数、构造函数的区别&#xff0c;任何函数都可以作为构造函数&#xff0c;但是并不能将任意函数叫做构造函数&…

【Godot4.2】颜色完全使用手册

概述 本篇简单汇总Godot中的颜色的构造和使用&#xff0c;内容包括了&#xff1a; RGB、RGBA&#xff0c;HSV以及HTML16进制颜色值、颜色常量等形式构造颜色颜色的运算以及取反、插值用类型化数组、紧缩数组或PNG图片形式存储多个颜色 构造颜色 因为颜色是一种视觉元素&…

Vue中使用Lodash

Vue中使用Lodash 前言安装Lodash引用方法vue中使用1、cloneDeep 深拷贝2、uniq 数组去重3、uniqWith 数组对象去重 isEqual 深度比对4、intersection 提取数组相同元素5、chunk 数组切分6、compact去除假值7、reject:根据条件删除指定的值8、find:查找结果的第一个值9、filter:…

VsCode 配置go开发环境之下载go tools

ctrl shift P 选择 go install/update tools&#xff0c;下载go tools 报错&#xff0c; 提升dial err。 将GOPROXY 和 GOSUMDB 按照如下配置&#xff0c;重启IDE即可成功下载 set GOPROXYhttps://goproxy.cn set GOSUMDBoff

(18)C#采集微信群群成员列表信息-微信UI自动化(.Net)

往期知识回顾 (1)C#开启探索微信自动化之路-微信UI自动化 (2)C#创建微信窗体自动化实例-微信UI自动化 (3)C#针对系统热键管理-微信UI自动化 (4)C#采集微信通讯录和联系人-微信UI自动化 (5)C#实现针对微信窗体鼠标静默点击-微信UI自动化 (6)C#搜索微信通讯录联系人-微信UI…

什么是API安全性以及为什么它很重要?

API指的是应用程序接口&#xff08;Application Programming Interface&#xff09;&#xff0c;是一组定义和描述不同软件组件如何通信以及相互操作的规范。它允许不同的软件系统之间共享数据和功能&#xff0c;使它们能够相互连接和交互。 API可以是不同软件之间的通信桥梁&…

进入docker容器中安装软件失败解,国外源慢,时间不同步,执行命令权限不够等问题解决办法

进入docker容器中安装软件失败解&#xff0c;时间不同步, 国外源慢&#xff0c;执行命令权限不够 等问题解决办法 首先我进入docker容器中&#xff0c;为了安装一个软件&#xff0c;引出了很多报错问题&#xff0c;报错如下&#xff1a; 1、无法用 ifconfig 或者 ip addr 的方…

HAProxy高性能负载均衡器

一、HAProxy基础知识 &#xff08;一&#xff09;HAProxy概述 HAProxy是一款基于事件驱动、单进程模型设计的四层与七层负载均衡器&#xff0c;它能够在TCP/UDP层面以及HTTP(S)等应用层协议上实现高效的流量分发。HAProxy不仅适用于Web服务器负载均衡&#xff0c;还能应用于数据…

vulhub中DNS域传送漏洞复现

DNS协议支持使用axfr类型的记录进行区域传送&#xff0c;用来解决主从同步的问题。如果管理员在配置DNS服务器的时候没有限制允许获取记录的来源&#xff0c;将会导致DNS域传送漏洞。 环境搭建 Vulhub使用Bind9来搭建dns服务器&#xff0c;但不代表只有Bind9支持AXFR记录。运行…

网络通信.

1.物理层&#xff1a;网络通信的基础设施 运快递的公路 2.数据链路层 两个相邻的节点之间如何传输 两个集散点之间的传输 3.网络层 两个点之间的路径规划 物流公司规划快递的路径 4.传输层 两个点之间的通信&#xff08;不考虑路径规划&#xff09; 卖家发货 只考虑起点和终点 …

java----网络编程(一)

一.什么是网络编程 用户在浏览器中&#xff0c;打开在线视频网站&#xff0c;如优酷看视频&#xff0c;实质是通过网络&#xff0c;获取到网络上的一个视频资源。 与本地打开视频文件类似&#xff0c;只是视频文件这个资源的来源是网络。所谓网络资源就是网络中获取数据。而所…