QT3.2版本QMessageBox字符串过长不能显示的bug修复

简介:

  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 newline
15          }
16         if ( indexShortString >= maxLine&&textTemp.at(indexLongString) == ' ' ) { //When longer than maxLine
17              indexShortString = 0;                                                 //turn to a newline at a char ' ' nearby
18              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下就不会有这个问题,而且即使出了问题你知道去哪里找。



目录
相关文章
|
3月前
QT4.7版本的OPENGL的3D旋转模型例子
QT4.7版本的OPENGL的3D旋转模型例子
|
5月前
|
编译器
Qt获取当前所用的Qt版本、编译器、位数等信息
Qt获取当前所用的Qt版本、编译器、位数等信息
获取下载Qt安装包,Qt源码全国网址备忘录(不用注册Qt账户,即可下载各版本Qt安装包和Qt源码包)
获取下载Qt安装包,Qt源码全国网址备忘录(不用注册Qt账户,即可下载各版本Qt安装包和Qt源码包)
获取下载Qt安装包,Qt源码全国网址备忘录(不用注册Qt账户,即可下载各版本Qt安装包和Qt源码包)
|
3月前
Qt6学习笔记五(自定义对话框、QMessageBox、QColorDialog、QFileDialog、QFontDialog)
Qt6学习笔记五(自定义对话框、QMessageBox、QColorDialog、QFileDialog、QFontDialog)
40 0
|
1月前
|
SQL XML API
Qt C++ 模块 描述列表【从Qt 官网 6.5 版本翻译】
Qt C++ 模块 描述列表【从Qt 官网 6.5 版本翻译】
13 0
|
1月前
QT 5.14.2版本 MAC环境安装部署流程
QT 5.14.2版本 MAC环境安装部署流程
|
5月前
《QT从基础到进阶·二十三》弹窗提示框QMessageBox和QCloseEvent事件
《QT从基础到进阶·二十三》弹窗提示框QMessageBox和QCloseEvent事件
79 0
|
5月前
12 QT - Qt4版本的信号槽写法
12 QT - Qt4版本的信号槽写法
23 0
|
11月前
|
开发者
Qt之标准对话框(QMessageBox、QFileDialog)
Qt之标准对话框(QMessageBox、QFileDialog)
117 0
|
12月前
|
关系型数据库 MySQL 数据库连接
Qt+MySql开发笔记:Qt5.9.3的msvc2017x64版本编译MySql8.0.16版本驱动并Demo连接数据库测试
mysql驱动版本msvc2015x32版本调好, mysql的mingw32版本的驱动上一个版本编译并测试好,有些三方库最低支持vs2017,所以只能使用msvc2017x64,基于Qt5.9.3,于是本篇编译mysql驱动的msvc2017x64版本,满足当前的特定需求,这次过程有点费劲,可能是Qt的版本低于Qt5.12,继续无保留分享出来。   本篇主要描述Qt5.9.3 msvc2017x64 + mysql8.0.16的驱动编译过程。

推荐镜像

更多