• 7239阅读
  • 6回复

QThread中的奇怪问题 [复制链接]

上一主题 下一主题
离线紫露霜凝
 
只看楼主 倒序阅读 楼主  发表于: 2010-08-28
— 本帖被 XChinux 从 General Qt Programming 移动到本区(2011-01-02) —
在QThread建立的线程中使用QFontMetrics中的width(QChar)获取单个字符宽度有问题,同一字号下读取所有字符宽度都是一样的
部分代码如下:
font.setFamily("Wenquanyi Bitmap Song");
QFontMetrics fm = QFontMetrics::QFontMetrics(font);
    QString s1="iabcomn";
    int size=s1.size();
    int sint;
    for(int i=0;i<size;i++)
    {
        sint=fm.width(s1.at(i));
    }
将此段程序加入run()中时,获取的所有字符宽度一样;倘若加入QThread内与run()无关的函数中则可获取真实的字符宽度。
不知是什么原因引起,也不知怎么解决,期待各位给予提示,说说出现这种情况的原因,谢谢先。
[ 此帖被紫露霜凝在2010-08-28 10:49重新编辑 ]
离线dbzhang800

只看该作者 1楼 发表于: 2010-08-28
不清你的问题出在哪儿,但从你的描述中可以看出,似乎有个基本概念你还没搞清:“run()是次线程,但QThread类其他函数并不在次线程中,除非它在run中被调用,或者你使用了movetothread”
离线紫露霜凝
只看该作者 2楼 发表于: 2010-08-28
回 1楼(dbzhang800) 的帖子
是啊,所以说这个问题只出现在次线程中
离线tootzoe
只看该作者 3楼 发表于: 2010-08-28
根本没问题, 我在 Window  和  fedora13 下测试都没问题, 宽度不一样.....

  1. #include <QApplication>
  2. #include <QTextCodec>
  3. #include <QFont>
  4. #include <QFontMetrics>
  5. #include <QWidget>
  6. #include <QThread>
  7. #include <QDebug>
  8. class tootThr : public QThread
  9. {
  10. public:
  11.     tootThr(QObject *parent=0) : QThread(parent){}
  12. protected:
  13.     void run(){
  14.         QFont font;
  15.         font.setFamily("WenQuanYi Bitmap Song");
  16.         QString s1="iabcomn120";
  17.         QFontMetrics fm(font) ;
  18.             int size=s1.size();
  19.             for(int i=0;i<size;i++)          
  20.                  qDebug() << "From Thr : " << fm.width(s1.at(i));
  21.     }
  22. };
  23. int main(int argc , char **argv)
  24. {
  25.     QApplication app(argc, argv);
  26.     QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
  27.     QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
  28.     QFont font;
  29.     font.setFamily("WenQuanYi Bitmap Song");  
  30.     QString s1="iabcomn";
  31.     QFontMetrics fm(font) ;
  32.         int size=s1.size();
  33.         for(int i=0;i<size;i++)      
  34.             qDebug() << fm.width(s1.at(i));          
  35.      tootThr *thr = new tootThr;
  36.      thr->start();
  37.     return   app.exec();
  38. }
离线紫露霜凝
只看该作者 4楼 发表于: 2010-08-28
回 3楼(tootzoe) 的帖子
真是不知道问题出在,明明都是一样的程序,为什么到我这就会有这样的问题了,困惑啊……
离线紫露霜凝
只看该作者 5楼 发表于: 2010-08-28
回 3楼(tootzoe) 的帖子
你这个程序在我这也是会出现这个问题,次线程中得到的字符宽度都是12
离线jdwx

只看该作者 6楼 发表于: 2011-01-05
试了一下:全部是6
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
快速回复
限100 字节
 
上一个 下一个