博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
QT3.2版本QMessageBox字符串过长不能显示的bug修复
阅读量:6477 次
发布时间:2019-06-23

本文共 2652 字,大约阅读时间需要 8 分钟。

  BUG描述QT3.2版本的QMessageBox有这样一个bug,就是当你传的参数足够长以至于你的屏幕不能显示的时候就会将字符串截断,剩下的字符串就无法显 示了,如果本身的字符串长度已知,那就很好办了,在字符串中间加换行符呗,但是很多时候这个字符串的长度是不定的,程序中发生异常了catch后把字符串 显示出来,不同的问题显示的长度就不一样。 

       到QT4这个bug就被修复了,但是很多较老的软件用的还是QT3的版本,偶尔会遇到这个问。

        解决方案解决问题的方法能看出一个人处理问题的能力。解决这个问题有三个方法:1,在QMessageBox调用之前判断字符串,只解决一个位置的bug,显然不 行;2,在工程中新建一个QMessageBox类,把QT库的QMessageBox宏定义到新的QMessageBox下面的方法,然后改变编译器检 索函数库的顺序。这个办法能解决问题,但是很不幸,我宏定义之后还是会调用QT的函数,不知道是不是编译器的问题,后来没办法就重新定义一个 QMessageBoxN类,然后批量改里面所有的函数,问题是解决了,但是扩展性太差,为以后的维护和升级带来不便3,修改QT库,重新编译QT库,肯 定可以根本解决问题。

        方案选择开始看到这个问题第一反应就是用第一种方法,较长就插个换行,但是程序中所有的甬道这个函数的地方都有出项这个问题的隐患,当时直接想到的就是修改QT 库,然后编译,用新的dll就可以了,但是当时因为编译3.2遇到了一些问题,半天也没编译成功,编译出来的dll总是少200多个函数,后来偷懒采取了 第二种方法,其实用第二种方法就开始做民工了,工程里面有四十多个solution,就这样批量的替换了四十多次,问题是解决了,但是很不甘心。于是又去 编译QT库,后来通过查找log文件,终于变过了,改就很简单了

1 QString QMessageBox::textJudgement( const QString &text ) 2 { 3     QString textTemp(text); 4      5     int indexLongString = 0;                      //the index of whole string 6      int indexShortString = 0;                     //the index of one line  7      int maxLine = 200;                            //the max of one line  8      int changePoint = 100;                        //the point turn to a newline 9  10     while ( textTemp.at( indexLongString)!='\0' ) {11         indexLongString++;12         indexShortString++;13         if ( textTemp.at( indexLongString) == '\n' ) { //When meet char '\n'14              indexShortString = 0;                      //turn to a newline15          }16         if ( indexShortString >= maxLine&&textTemp.at(indexLongString) == ' ' ) { //When longer than maxLine17              indexShortString = 0;                                                 //turn to a newline at a char ' ' nearby18              textTemp.insert( indexLongString,'\n' ); 19         }20     }21     return textTemp; 22 }

 主要在QMessageBox添加这样一个函数,来判断字符串是否过长,注意不能把一个单词分成两个。然后在这个类里面的几个QMessageBox函数前面调用这个函数,如下

1 int QMessageBox::question( QWidget *parent, 2                            const QString& caption, const QString& text, 3                            int button0, int button1, int button2 ) 4 { 5     QString temp = textJudgement(text); 6     QMessageBox *mb = new QMessageBox( caption, temp, Question, 7                                        button0, button1, button2, 8                                        parent, "qt_msgbox_information", TRUE, 9                        WDestructiveClose);10     Q_CHECK_PTR( mb );11     return mb->exec();12 }

       小结 以前自己是很少去看源码的,但是有时候解决问题最好的办法就是看源码,改源码,而且看源码学东西更快一些。这就是开源的好处吧,如果QT不是开源 的,那要解决问题就会更麻烦一些,而且大多时候很莫名其妙的冒出一个问题,不知道是哪里引起的,就像windows下经常打来一个程序上来就一句 XXXXX地址不能read,然后程序就挂了,但是在linux下就不会有这个问题,而且即使出了问题你知道去哪里找。

转载地址:http://vpqko.baihongyu.com/

你可能感兴趣的文章
cell reuse & disposebag
查看>>
【故障处理】ORA-12545: Connect failed because target host or object does not exist
查看>>
云时代,程序员将面临的分化
查看>>
js判断移动端是否安装某款app的多种方法
查看>>
学习angularjs的内置API函数
查看>>
4、输出名称 Exported names
查看>>
paste工具
查看>>
Pre-echo(预回声),瞬态信号检测与TNS
查看>>
【转载】如何发送和接收 Windows Phone 的 Raw 通知
查看>>
poj2378
查看>>
Java文件清单列表
查看>>
js url传值中文乱码之解决之道
查看>>
Atitit.获取某个服务 网络邻居列表 解决方案
查看>>
Trusty TEE
查看>>
[LeetCode] Reverse String 翻转字符串
查看>>
学习iOS【3】数组、词典和集合
查看>>
Hessian 原理分析--转
查看>>
转: 基于netty+ protobuf +spring + hibernate + jgroups开发的游戏服务端
查看>>
easyui传入map的数据前台展示出tree格式数据
查看>>
悲观的思考,乐观的生活.我们既需要思考的深度,也需要生活的温度!
查看>>