Mac OS 从 Qt 15.2 获取显示配置文件 URL 或名称

问题描述

我正在尝试从 Qt 环境中获取自定义 ICC 配置文件的 url 路径或 Mac OS 中每个显示器的通用配置文件名称。我已经尝试了以下主显示,但它返回一个空字符串。就我而言,正确答案是系统偏好设置中的“/Users/roryhill/Library/ColorSync/Profiles/MacBook LCD_06-02-2021.icc”。

    auto displayId = CGMaindisplayID();
    auto colorSpace = CGdisplaycopyColorSpace(displayId);
    auto name = CGColorSpacecopyName(colorSpace);

解决方法

我在 https://github.com/ndevenish/Hugin 找到了解决方案。为了在 Qt 环境中运行,我做了一些小调整。

在标题中:

static QString getDisplayProfileURL();
typedef struct {
    CFUUIDRef dispuuid;
    CFURLRef url;
} ColorSyncIteratorData;
static bool colorSyncIterateCallback(CFDictionaryRef dict,void *data);

和来源

bool Mac::colorSyncIterateCallback(CFDictionaryRef dict,void *data)
{
    ColorSyncIteratorData *iterData = (ColorSyncIteratorData *)data;
    CFStringRef str;
    CFUUIDRef uuid;
    CFBooleanRef iscur;

    if (!CFDictionaryGetValueIfPresent(dict,kColorSyncDeviceClass,(const void**)&str))
    {
        qWarning("kColorSyncDeviceClass failed");
        return true;
    }
    if (!CFEqual(str,kColorSyncDisplayDeviceClass))
    {
        return true;
    }
    if (!CFDictionaryGetValueIfPresent(dict,kColorSyncDeviceID,(const void**)&uuid))
    {
        qWarning("kColorSyncDeviceID failed");
        return true;
    }
    if (!CFEqual(uuid,iterData->dispuuid))
    {
        return true;
    }
    if (!CFDictionaryGetValueIfPresent(dict,kColorSyncDeviceProfileIsCurrent,(const void**)&iscur))
    {
        qWarning("kColorSyncDeviceProfileIsCurrent failed");
        return true;
    }
    if (!CFBooleanGetValue(iscur))
    {
        return true;
    }
    if (!CFDictionaryGetValueIfPresent(dict,kColorSyncDeviceProfileURL,(const void**)&(iterData->url)))
    {
        qWarning("Could not get current profile URL");
        return true;
    }

    CFRetain(iterData->url);
    return false;
}

QString Mac::getDisplayProfileURL()
{
    ColorSyncIteratorData data;
    data.dispuuid = CGDisplayCreateUUIDFromDisplayID(CGMainDisplayID());
    data.url = NULL;
    ColorSyncIterateDeviceProfiles(colorSyncIterateCallback,(void *)&data);
    CFRelease(data.dispuuid);
    CFStringRef urlstr = CFURLCopyFileSystemPath(data.url,kCFURLPOSIXPathStyle);
    CFRelease(data.url);
    return QString::fromCFString(urlstr);
}