QT 中将 QString 转化为 const char * 的问题
我开始的代码是这样的:
QString qstr = "abcdef";
const char * cc = qstr.toAscii().constData();
但是此时输出 cc 要么是空,要么是乱码的。而 strlen(cc) 的值比 6 小。
将代码改为
1 QString qstr = "abcdef";
2 QByteArray qba = qstr.toAscii();
3 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 定时器,但是定时器无法正常工作。
1 void SubThread::run() { 2 QTimer *timer = new QTimer(this); 3 connect(timer, SIGNAL(timeout()), this, SLOT(process())); 4 timer->start(2000); 5 } 6 7 void SubThread::process() { 8 // do something 9 }
时间到了,触发了 timeout() 信号,但是槽函数却没有触发。
在 run() 方法的最后加上 exec() 方法就行了
1 void SubThread::run() { 2 QTimer *timer = new QTimer(this); 3 connect(timer, SIGNAL(timeout()), this, SLOT(process())); 4 timer->start(2000); 5 exec(); 6 } 7 8 void SubThread::process() { 9 // do something 10 }
--------- references -----------
【1】csdn 文章: “QT中QString 转const char*为乱码或为空的问题 ”之解决方案
【2】csdn 文章: Qt多线程中调用QTimer
【3】csdn 文章: QString 与中文问题
【4】网易博客: QString中文乱码