zoukankan      html  css  js  c++  java
  • QT 的使用及编写代码遇到的问题和解决方法

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

    本博客由 BriFuture 原创,并在个人博客(WordPress构建) BriFuture's Blog 上发布。欢迎访问。
    欢迎遵照 CC-BY-NC-SA 协议规定转载,请在正文中标注并保留本人信息。
  • 相关阅读:
    (转载)Linux进程基础
    C语言字符串
    DNS域名解析服务
    Linux-SSH远程管理
    Linux文件系统深入了解
    Linux进程和计划任务管理
    Linux账户与权限管理
    MySQL实现读写分离
    SQL数据库常用函数
    MySQL进阶查询(二)
  • 原文地址:https://www.cnblogs.com/brifuture/p/6007550.html
Copyright © 2011-2022 走看看