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

时间:2022-07-14 21:23:51

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