QT 的使用及编写代码遇到的问题和解决方法
QT 中将 QString 转化为 const char * 的问题
我开始的代码是这样的:
QString qstr = "abcdef";
const char * cc = qstr.toAscii().constData();
但是此时输出 cc 要么是空,要么是乱码的。而 strlen(cc) 的值比 6 小。
将代码改为
QString qstr = "abcdef";
QByteArray qba = qstr.toAscii();
const char * cc = qba.constData();
输出 cc, 就可以看到 abcdef 了。
原理请查看 参考文章【1】
=============
另外,在 QString 中输入中文,然后输出到 cout() 流或者 qDebug() 流中,非常容易出现乱码,有时设置 UI界面的标题也会乱码。
对于 QString 的编码具体原理也不少很懂,但是经过多次尝试发现
1 QString str = "中文";
2
3 QByteArray qba = str.toAscii();
4
5 str = QString::fromUtf8(qba);
6
7 qDebug() << str; // 输出 "中文", 在 QtCreator 里面就没有乱码了
8
9 cout << str; //同样不会乱码
用 str.toLocal8bit() 好像也可以正确编码中文。
今天发现,有时候手动修改字符串编码,显示中文还是会乱码。也就是说以上的方法是错误的,可能只是碰巧正确解码了。
可以在 main() 函数里加上
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
这样的话,整个工程的 QString 都是使用 UTF-8 来进行编码的了。当然,我的项目的编码也是 UTF-8。这样中文就能正确编码了。
推荐看 QString 与中文问题(这个 csdn 文章是转载的,但是没有写转自哪里,不过讲解的还是很清楚)和 QString中文乱码 。这两篇都说清楚了 QString 的原理。
################# 分割线 #######################
在 QThread 子类中运行 QTimer 定时器,但是定时器无法正常工作。
void SubThread::run() {
QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(process()));
timer->start();
}
void SubThread::process() {
// do something
}
时间到了,触发了 timeout() 信号,但是槽函数却没有触发。
在 run() 方法的最后加上 exec() 方法就行了
void SubThread::run() {
QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(process()));
timer->start();
exec();
}
void SubThread::process() {
// do something
}
--------- references -----------
【1】csdn 文章: “QT中QString 转const char*为乱码或为空的问题 ”之解决方案
【2】csdn 文章: Qt多线程中调用QTimer
【3】csdn 文章: QString 与中文问题
【4】网易博客: QString中文乱码
QT 的使用及编写代码遇到的问题和解决方法的更多相关文章
- struts2视频学习笔记 19-20(手工编写代码实现所有方法和指定方法校验)
课时19 对Action中所有方法进行输入校验 1.手工编写代码实现对action中所有方法输入校验 通过重写validate() 方法实现, validate()方法会校验action中所有与exe ...
- QT visual stuido 集成插件不能打开ui文件的解决方法(去掉xml的UTF8标记)
QT visual stuido 集成插件不能打开ui文件的解决方法 visual studio里不能打开这个ui文件,出现warning等解决方法是:于是将<?xml version=&quo ...
- win10安装PS和AI后报代码为16的错误解决方法
win10安装PS和AI后报代码为16的错误解决方法 一.总结 一句话总结:修改兼容性和以管理员方式运行就可以了 修改兼容性 以管理员身份运行 二.PS和AI安装后报代码为16的错误解决方法介绍(转) ...
- Qt中QPushButton、QTabWidget等部件内容文字换行的解决方法(一定要写在源码里,写在翻译文件里不行,因为\n得不到转义)
最近在做基于Qt的应用项目,其中有一个按钮文字超长,需要换一行显示.从网上找到的建议都是将要显示的内容做成图片,然后将图片设置为该按钮的背景.但是这样做有一个很大的局限性,当需要更改内容文字的时候,需 ...
- SVN版本号管理工具使用中常见的代码提交冲突问题的解决方法
相信刚開始学习使用SVN的小伙伴在项目合作开发的过程中一定常常遇到一些影响到自己编写的代码的苦恼.我这里列举了几种常见的问题以及问题的解决方法: 1.误删除和误操作的问题 问题1:有A和B两个人一块合 ...
- MyEclipse和tomcat结合编写jsp对于中文乱码的解决方法
一.Java和jsp 中文乱码原因和解决方法: Java的内核和class文件是基于unicode的,这使Java程序具有良好的跨平台性,但也带来了一些中文乱码问题的麻烦.原因有两方面: 第一方面:J ...
- WIN10 网卡驱动异常代码56的问题及解决方法
故障描述: 原来使用正常的一个微机室,突然一天控制端主机网络连接异常,平时的网络控制软件无法使用.检查网络配置正常,网络诊断.修复.将网卡禁用也没有效果:后来删除网卡想重装,则恶运开始,无法安装驱动: ...
- QT编写的网页浏览器网页乱码解决方法
1.如果是本地网页,可以将网页编码改为GB2312 <meta http-equiv="Content-Type" content="text/html; char ...
- Qt在Linux环境下应用程序字体模糊的解决方法(先改成使用默认字体,然后使用qtconfig配置)
这两天一直在用Qt实现一个跨平台的软件.软件之前在Windows上编写的,后来放到里Ubuntu 10.10下编译.程序运行时遇到一个很棘手的问题,界面文本非常模糊.后来在网上查阅了好几天的资料,经历 ...
随机推荐
- 采用FirePHP调试PHP程序
采用FirePHP调试PHP程序 FirePHP是什么? FirePHP是一个利用Firebug console栏输出调试信息方便程序调试.这一切只需要调用几个简单的函数. 他看起来是怎么个样子? 1 ...
- oracle与sqlserver利用函数生成年月日加流水号
最近在做oracle相关的项目,刚接触oracle,与sqlserver语法上还是有区别的 sqlserver : 示例:FX+当前年月日+00001 如下图流水号实力所示 原理: 首先 'FX'是固 ...
- JavaScript 正则表达式入门教程
正则表达式是描述一组字符串特征的模式,用来匹配特定的字符串 主要分三个部分:基本语法.RegExp对象的方法.JS中支持正则表达式的String对象方法 一.基本语法 在JS中,正则表达式为对象,用如 ...
- redis使用Lua脚本
最近在看<Redis入门指南>第二版,感觉收获挺大,推荐大家有时间看一看.其中有一章讲Lua脚本,感觉挺实用,把总结整理一下. Redis在2.6中推出了脚本功能,允许开发者使用Lua语言 ...
- 以Tomcat+Mysql为例,实现Docker多容器连接
Docker提供了多个容器直接访问的方法,最简单的方式是直接使用端口映射-p参数指定映射的端口或者-P映射所有端口,多个容器直接通过网络端口进行访问. 但网络端口映射方式并不是Docker中连接多个容 ...
- 汇编实现HelloWorl!
hello word~ ASSUME CS:CODE,DS:DATA DATA SEGMENT DB "HELLO WORLD" ;存储要显示的数据 DATA ENDS CODE ...
- Form开发:字段关系-消息-快速编码-参数和系统变量
1.字段关系 清除依赖字段:在挂LOV的名称字段的WHEN-VALIDATE-ITEM调用:app_field.clear_dependent_fields 设置字段依赖:在主字段的WHEN ...
- Ubuntu 14.04 64bit 系统下打开PHPadmin时出现缺少mysqli|mysql 扩展的解决方法(php5)
网上找了很多方法,都是翻来覆去的抄袭. 都在说把 /etc/php5/apache2/php.ini 下面的 ;extension=php_mysqli.dll 前面的 ; 注释符号去掉 再重启 ...
- Apache工作原理
Apache工作原理 在开始了解Apache前,我们先熟悉一下web服务器,因为apache也是web服务器的一种. Web系统由客户端(浏览器)和服务 ...
- 使用Dom解析器,操作XML里面的信息
import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;impo ...