文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>QT3.2版本QMessageBox字符串过长不能显示的bug修复

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

时间:2011-03-07  来源:ShaPherD

       解决方案:解决问题的方法能看出一个人处理问题的能力。解决这个问题有三个方法: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下就不会有这个问题,而且即使出了问题你知道去哪里找。

相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载