Qt Creator插件制作小插曲:有关QT_NO_CAST_FROM_ASCII的注意事项

这两天制作了两个Qt Creator增强套装的两个插件,其实也是非常简单的,但是其实花了我超过四天的时间,为什么呢?因为我之前很长一段时间都是在Linux下开发的,一切安好,没有任何问题,但是到了Windows下,各种问题就暴露出来了。首先呢,就是——

1、Qt Creator源码中,默认是打开QT_NO_CAST_FROM_ASCII这个宏的,看文档,这个宏就是禁用一切来自双引号或者单引号的字符串字面量传入QString的函数。但是我们裸写字符串不是非常平常的一件事情么?这里是Qt Creator断了我们一条道路,解决的方法还是有的,我这里提供两个方法,欢迎提出新的方法:
1) 在

include($$QTCREATOR_SOURCES/src/qtcreatorplugin.pri)

这一句后面添加

DEFINES -= QT_NO_CAST_FROM_ASCII

如果还有必要的话,那么还需要添加

DEFINES -= QT_NO_CAST_TO_ASCII

这些都是解除设定宏的好方法

2) 使用QStringLiteral宏来包裹字面量
我还设计了两个宏,分别对应识别单个字符和字符串。他们分别是:

#define CHAR( c ) QChar( ushort( c ) )
#define TEXT QStringLiteral

这些都是非常方便的宏,可以很方便地替换掉裸写的字面量。

2、由于Windows下编译器有MinGW以及MSVC,我们要注意我们编写的插件是C++插件,是编译器相关的,比如说,MinGW编写的插件无法在MSVC编译器编译的Qt Creator上使用。遗憾的是,Qt Creator官方编译的都是MSVC的,而且有一个现象,不同的MSVC版本编写的Qt Creator依赖的Qt库,有一些函数的地址还不能通用。比如说和上面一个例子非常相似的例子,那就是我使用MSVC2015编译的Qt Creator插件,其中用到了QString::utf8()函数,但就是这个函数,无法在官方MSVC2013编译的Qt Creator中成功载入,提示“无法找到模块”。为什么呢?看看QString::utf8()函数源码吧:

#if defined(Q_COMPILER_REF_QUALIFIERS) && !defined(QT_COMPILING_QSTRING_COMPAT_CPP)
    QByteArray toLatin1() const & Q_REQUIRED_RESULT
    { return toLatin1_helper(*this); }
    QByteArray toLatin1() && Q_REQUIRED_RESULT
    { return toLatin1_helper_inplace(*this); }
    QByteArray toUtf8() const & Q_REQUIRED_RESULT
    { return toUtf8_helper(*this); }
    QByteArray toUtf8() && Q_REQUIRED_RESULT
    { return toUtf8_helper(*this); }
    QByteArray toLocal8Bit() const & Q_REQUIRED_RESULT
    { return toLocal8Bit_helper(constData(), size()); }
    QByteArray toLocal8Bit() && Q_REQUIRED_RESULT
    { return toLocal8Bit_helper(constData(), size()); }
#else
    QByteArray toLatin1() const Q_REQUIRED_RESULT;
    QByteArray toUtf8() const Q_REQUIRED_RESULT;
    QByteArray toLocal8Bit() const Q_REQUIRED_RESULT;
#endif

看出来什么吗?不同的预编译宏会导致不同版本的toUtf8()函数被编译,难怪Qt Creator发现QString::utf8()函数和自己Qt库中的这个函数地址不一致会报“无法找到模块”错误呢。

那,有没有解决的方法呢?由于Json格式化,一定要这样的函数,因此我打算看看它的源码,是否能够找到替代的实现方法。没错,就是

toUtf8_helper(*this);

中,我找到了

QUtf8::convertFromUnicode()

方法
终于找到了这个方法,又偶然发现QTextCodec::fromUnicode()函数中隐含调用了上述函数,于是我这么操作:

    QTextCodec* utf8Codec = QTextCodec::codecForName( "UTF-8" );

    QString plainText = ui->jsonEdit->toPlainText( );
    QByteArray converted = QJsonDocument::fromJson( utf8Codec->fromUnicode( plainText ) ).
            toJson( QJsonDocument::Indented );
    plainText = utf8Codec->toUnicode( converted );

顺利实现效果!

开发Qt Creator的过程中,每一步都是一个坑。但万变不离其宗,只要你有耐心,找到规律,找到核心问题,相信你一定和我一样,最终会找到问题的答案的。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
编译qtcreator源码,在make过程中报错(我这里是qtcreator4.4.1,其他版本也会有同样的错误,解决方法相同) g++ -c -pipe -fPIC -fpermissive -finline-functions -Wno-long-long -O2 -std=gnu++1y -fvisibility=hidden -fvisibility-inlines-hidden -Wall -W -D_REENTRANT -fPIC -DQTCSSH_LIBRARY -D'RELATIVE_PLUGIN_PATH="../lib/qtcreator/plugins"' -D'RELATIVE_LIBEXEC_PATH="../libexec/qtcreator"' -D'RELATIVE_DATA_PATH="../share/qtcreator"' -D'RELATIVE_DOC_PATH="../share/doc/qtcreator"' -DIDE_LIBRARY_BASENAME=\"lib\" -DQT_CREATOR -DQT_NO_CAST_TO_ASCII -DQT_RESTRICTED_CAST_FROM_ASCII -DQT_DISABLE_DEPRECATED_BEFORE=0x050600 -DQT_USE_FAST_OPERATOR_PLUS -DQT_USE_FAST_CONCATENATION -DBOTAN_DLL= -DBOTAN_TARGET_OS_HAS_GETTIMEOFDAY -DBOTAN_HAS_ALLOC_MMAP -DBOTAN_HAS_ENTROPY_SRC_DEV_RANDOM -DBOTAN_HAS_ENTROPY_SRC_EGD -DBOTAN_HAS_ENTROPY_SRC_FTW -DBOTAN_HAS_ENTROPY_SRC_UNIX -DBOTAN_HAS_MUTEX_PTHREAD -DBOTAN_HAS_PIPE_UNIXFD_IO -DBOTAN_TARGET_OS_IS_LINUX -DBOTAN_TARGET_OS_HAS_CLOCK_GETTIME -DBOTAN_TARGET_OS_HAS_DLOPEN -DBOTAN_TARGET_OS_HAS_GMTIME_R -DBOTAN_TARGET_OS_HAS_POSIX_MLOCK -DBOTAN_HAS_DYNAMICALLY_LOADED_ENGINE -DBOTAN_HAS_DYNAMIC_LOADER -DBOTAN_BUILD_COMPILER_IS_GCC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_NETWORK_LIB -DQT_CONCURRENT_LIB -DQT_CORE_LIB -I../../../src -I../../../src -I../../libs -I/opt/qt-creator-opensource-src-4.4.1/tools -I../../plugins -I../3rdparty -I/opt/arm-qt/include -I/opt/arm-qt/include/QtWidgets -I/opt/arm-qt/include/QtGui -I/opt/arm-qt/include/QtNetwork -I/opt/arm-qt/include/QtConcurrent -I/opt/arm-qt/include/QtCore -I.moc/release-shared -I.uic -I/opt/arm-qt/mkspecs/linux-g++ -o .obj/release-shared/botan.o ../3rdparty/botan/botan.cpp ../3rdparty/botan/botan.cpp:46226:21: fatal error: cpuid.h: No such file or directory compilation terminated. Makefile:5559: recipe for target '.obj/release-shared/botan.o' failed make[3]: *** [.obj/release-shared/botan.o] Error 1 make[3]: Leaving directory '/opt/qt-creator-opensource-src-4.4.1/src/libs/ssh' Makefile:314: recipe for target 'sub-ssh-make_fir

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值