QT 的使用及编写代码遇到的问题和解决方法

时间:2021-08-14 15:32:50

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中文乱码