Конвертировать CFStringRef в QString

Кросс -платформенный файл заголовка C++. отдельный файл C++ для каждой платформы: Windows, Linux, Mac. Работает с платформой реализации перечисления окон.

на стороне Mac: у меня есть заполненный CFStringRef. заголовочный файл определяет объект QString. Мне нужно передать содержимое CFStringRef в QString.

Как этого достичь?

2 ответа

Решение

Это статическая функция, используемая внутри Qt (из src/corelib/kernel/qcore_mac.cpp):

QString QCFString::toQString(CFStringRef str)
{
    if (!str)
        return QString();

    CFIndex length = CFStringGetLength(str);
    if (length == 0)
        return QString();

    QString string(length, Qt::Uninitialized);
    CFStringGetCharacters(str, CFRangeMake(0, length), reinterpret_cast<UniChar *> 
        (const_cast<QChar *>(string.unicode())));
    return string;
}

Вы можете использовать метод fromCFString(), включенный в класс QString:

CFStringRef str = CFSTR("Hello World!");
QString convertedStr = QString::fromCFString(str);

Я не пробовал, но я бы сделал что-то вроде этого:

QVector<UniChar> uniChars(CFStringGetLength(cfStr));
CFStringGetCharacters(cfStr, CFRangeMake(0, CFStringGetLength(cfStr), uniChars.data());
QString qString = QString::fromUtf16(uniChars.data(), uniChars.size());

Чтобы избежать выделения буфера UniChar, вы можете попробовать CFStringGetCharactersPtr() сначала и используйте буферный как запасной вариант.

Другие вопросы по тегам