Конвертировать 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()
сначала и используйте буферный как запасной вариант.