1

跨平台 C++ 头文件。每个平台都有单独的 c++ 文件:windows、linux、mac。处理枚举窗口的特定于平台的实现。

在 mac 方面:我有一个 CFStringRef 填充。头文件定义了一个 QString 对象。我需要将 CFStringRef 的内容传递给 QString。

如何做到这一点?

4

3 回答 3

5

这是 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;
}

更新(2020 年):现在使用QString::fromCFString()正如@ehopperdietzel 在他的回答中所建议的那样。

于 2012-03-15T19:31:00.510 回答
2

您可以使用QString类中包含的fromCFString()方法:

CFStringRef str = CFSTR("Hello World!");
QString convertedStr = QString::fromCFString(str);
于 2020-04-26T20:55:52.853 回答
0

我没有尝试过,但我会做这样的事情:

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

为避免分配 UniChar 缓冲区,您可以CFStringGetCharactersPtr()先尝试使用缓冲区一作为后备。

于 2012-03-15T18:44:27.890 回答