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

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

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

这一句后面添加

  1. DEFINES -= QT_NO_CAST_FROM_ASCII

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

  1. DEFINES -= QT_NO_CAST_TO_ASCII

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

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

  1. #define CHAR( c ) QChar( ushort( c ) )
  2. #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()函数源码吧:

  1. #if defined(Q_COMPILER_REF_QUALIFIERS) && !defined(QT_COMPILING_QSTRING_COMPAT_CPP)
  2. QByteArray toLatin1() const & Q_REQUIRED_RESULT
  3. { return toLatin1_helper(*this); }
  4. QByteArray toLatin1() && Q_REQUIRED_RESULT
  5. { return toLatin1_helper_inplace(*this); }
  6. QByteArray toUtf8() const & Q_REQUIRED_RESULT
  7. { return toUtf8_helper(*this); }
  8. QByteArray toUtf8() && Q_REQUIRED_RESULT
  9. { return toUtf8_helper(*this); }
  10. QByteArray toLocal8Bit() const & Q_REQUIRED_RESULT
  11. { return toLocal8Bit_helper(constData(), size()); }
  12. QByteArray toLocal8Bit() && Q_REQUIRED_RESULT
  13. { return toLocal8Bit_helper(constData(), size()); }
  14. #else
  15. QByteArray toLatin1() const Q_REQUIRED_RESULT;
  16. QByteArray toUtf8() const Q_REQUIRED_RESULT;
  17. QByteArray toLocal8Bit() const Q_REQUIRED_RESULT;
  18. #endif

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

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

  1. toUtf8_helper(*this);

中,我找到了

  1. QUtf8::convertFromUnicode()

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

  1. QTextCodec* utf8Codec = QTextCodec::codecForName( "UTF-8" );
  2. QString plainText = ui->jsonEdit->toPlainText( );
  3. QByteArray converted = QJsonDocument::fromJson( utf8Codec->fromUnicode( plainText ) ).
  4. toJson( QJsonDocument::Indented );
  5. plainText = utf8Codec->toUnicode( converted );

顺利实现效果!

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

http://blog.csdn.net/gamesdev/article/details/52167294

QT_NO_CAST_FROM_ASCII这个宏的,禁用一切来自双引号字符串字面量传入QString(有2种解决方法)的更多相关文章

  1. Mac电脑使用:您的安全性偏好设置仅允许安装来自App Store和被认可的开发者的应用(解决方法)

    在10ms加速器上下载了MAC客户端ShadowsocksX,打开软件,提示打不开,因为来自身份不明的开发者. 以下为解决办法: Step1:打开dock栏里面的“系统偏好设置” Step2:在系统偏 ...

  2. php 双引号字符串里包变量的用法

    第一种 $ary['a'] 去掉单引号$ary = array('a'=>1);$b = 5; $str = "fdsfdsf$ary[a]";$str = "fd ...

  3. Linux Shell中单引号、双引号、反引号的区别【转载】

    linux shell可以识别4种不同类型的引字符号: 单引号字符' 双引号字符" 反斜杠字符\ 反引号字符` 1. 单引号 ( '' )# grep Susan phonebook Sus ...

  4. php学习零散笔记—字符串分割、fetch函数和单双引号。

    1 字符串分割——split()函数和preg_split()函数 split — 用正则表达式将字符串分割到数组中——貌似PHP5.3以上已不赞成使用 array split ( string $p ...

  5. python--基础学习(三)字符串单引号、双引号、三引号

    1.基本认识 单引号字符串:'python' 双引号字符串:"python" 三引号字符串:'''python'''(三单引号),"""python& ...

  6. [译]JavaScript:将字符串两边的双引号转换成单引号

    原文:http://ariya.ofilabs.com/2012/02/from-double-quotes-to-single-quotes.html 代码的不一致性总是让人发狂,如果每位开发者都能 ...

  7. FineUi导出时禁用ajax即EnableAjax="false"出现问题的解决方法

    fineui导出时会出现乱码, 在按钮上添加EnableAjax="false"属性禁用ajax就可以正常导出.但如果我在后台代码中直接return 而不进行导出流操作,则前台脚本 ...

  8. (实用篇)PHP中单引号与双引号的区别分析

    在PHP中,我们可以使用单引号或者双引号来表示字符串.不过我们作为开发者,应该了解其中的区别.单引号与双引号对于定义字符一个是可以解析变量一个是会把变量直接输出来,同时单引号与双引号在字符处理上单引号 ...

  9. JS中字符串拼装 单双引号的处理 字符转义

    js中可能会用到动态追加元素,可能数据也是从后台传过来的,当然有两种思路, 1.在后台拼装好直接返回; 2.在前台js里面拼装, 如果拼装大量的html时可能单双引号就容易出问题;那么如何解决呢?最近 ...

随机推荐

  1. BZOJ 2190 SDOI 2008 仪仗队 线性欧拉筛

    标题效果:有一个格子组件图,假设三个人在一条直线上,那么第一个人将不会看到第三人.现在,有一个人站在(1,1)在.我问他是否能看到n*n的人数的矩阵. 思考:如果你想站(1,1)这名男子看到了一个立场 ...

  2. SQLite的查询优化

    SQLite是个典型的嵌入式DBMS,它有很多优点,它是轻量级的,在编译之后很小,其中一个原因就是在查询优化方面比较简单,它只是运用索引机制来进行优化的,经过对SQLite的查询优化的分析以及对源代码 ...

  3. Android菜鸟的成长笔记(23)——获取网络和SIM卡信息

    TelephonyManager是一个管理手机通话状态.电话网络信息的服务类,该类提供了大量的getXxx()方法来获取电话网络的相关信息.这些信息包括设备编号.软件版本.网络运营商代号.网络运营商名 ...

  4. Python采用struct处理二进制

    有时需要使用python二进制数据,实例,件.socket操作时.这时候.能够使用python的struct模块来完毕.能够用 struct来处理c语言中的结构体. struct模块中最重要的三个函数 ...

  5. 【a401】直线的交点数

    Time Limit: 1 second Memory Limit: 32 MB [问题描述] 平面上有n条直线,且无三线共点,问这些直线能有多少种不同的交点数. [输入格式] n(n≤20) [输出 ...

  6. 关于linux下如何使用svn 客户端

    1 yum install -y subversion (下载svn) 2 svn chekout "你的svn地址" 然后会询问? 我也不知道是嗄意思 , 大体就是权限什么乱七八 ...

  7. RadioButton分组的实现

    原文:RadioButton分组的实现     XAML如下 <StackPanel> <RadioButton GroupName="colorgrp"> ...

  8. 彩色图像--色彩空间 RGB系列

    学习DIP第62天 转载请标明本文出处:http://blog.csdn.net/tonyshengtan ,出于尊重文章作者的劳动,转载请标明出处!文章代码已托管,欢迎共同开发:https://gi ...

  9. SpringMVC+easyUI 分页,查询 (完整的CRUD)

    最终完毕CRUD的功能了,注意,这里会对前面有一些修改,UserController的listUser() 已经改写了,如今把所有整理一下吧. JSP: <%@ page language=&q ...

  10. XMPPFramework

    XMPP Extensible Messaging and Present Protocol 可扩展消息处理现场协议 特征: XMPP使用tcp传XML流程, 做IM xmpp.org objcio. ...