• 6589阅读
  • 8回复

这可能反映了Ubuntu的一个Bug? [复制链接]

上一主题 下一主题
离线peterxj108
 

只看楼主 倒序阅读 楼主  发表于: 2010-07-26
Ubuntu 10.04下安装新版Qt(apt-get法获得),编写程序时,有很大可能性在执行QMessageBox调用时弹出错对话框。RHEL5.3以及Windows下经试验无此错误。
大家分析一下?
离线peterxj108

只看该作者 1楼 发表于: 2010-08-01
难道没人碰到过?
离线dbzhang800

只看该作者 2楼 发表于: 2010-08-01
引用第1楼peterxj108于2010-08-01 10:51发表的  :
难道没人碰到过?


要确认是不是bug不是简单的事情,首先你需要编写一个比较短小的程序,来重现你的问题(要确定什么条件下发现问题)

然后其他人按照你所提供的代码及说明,能重现这个问题。才能确定是不是bug
离线wd007

只看该作者 3楼 发表于: 2010-08-01
把你的代码说说,光这样描述,不好判断。
欢迎访问我的博客,一起学习提高
http://blog.csdn.net/qter_wd007
离线peterxj108

只看该作者 4楼 发表于: 2010-08-04
void Func2::on_pushButton_clicked()//检查速度是否正常,并获得最大最小速度
{
    minspeed=maxspeed=-1;
    QTableWidgetItem *item;bool ok;
    for(int i=0;i<ui.tableWidget_velocity->rowCount();i++)
    {
        item = ui.tableWidget_velocity->takeItem(i, 0);
        double f = item->text().toDouble(&ok);
        ui.tableWidget_velocity->setItem(i, 0, item);
        if(ok)
        {
            if(maxspeed<f) maxspeed=f;
            if(minspeed>f||minspeed<0) minspeed=f;
        }
        else
        {
            QMessageBox::critical(this,tr("SRDP Seismic Modeling--Wrong velocity"),
                              tr("Velocity is not correct. Please go back and check.\n"));
            speedcorrect=false;
            return;
        }
    }
    if(minspeed<=0||maxspeed<=0||minspeed>maxspeed)
    {
        QMessageBox::critical(this, tr("SRDP Seismic Modeling--Wrong velocity"),
                              tr("Velocity is not correct. Please go back and check.\n"));
        speedcorrect=false;
        return;
    }
    speedcorrect=true;
    ui.pushButton->setEnabled(false);
    //将列表中的速度取出来赋给double *v;
    v=new double [ui.tableWidget_velocity->rowCount()];

    for(int i=0;i<ui.tableWidget_velocity->rowCount();i++)
        v=ui.tableWidget_velocity->item(i,0)->text().toDouble(&ok);
    scribbleArea->setVelocity(v);
    delete [] v;v=NULL;//v速度已经传给了scribbleArea,所以删掉好了
    QMessageBox::information(this,tr("SRDP Seismic Modeling--Velocity Information"),tr("The program has adopted your settings of velocity."));
    ui.pushButton_dao->setEnabled(true);
}
离线dbzhang800

只看该作者 5楼 发表于: 2010-08-04
引用第4楼peterxj108于2010-08-04 10:48发表的  :
void Func2::on_pushButton_clicked()//检查速度是否正常,并获得最大最小速度
{
    minspeed=maxspeed=-1;
    QTableWidgetItem *item;bool ok;
    for(int i=0;i<ui.tableWidget_velocity->rowCount();i++)
.......

说实话,这段代码写得真够乱的。 比如将每个 item 先 take 紧接着又set 回去。

再比如,完全看不出你怎么检测速度是否正常的(似乎完全没有检测,无论是正、是负、还是0都能通过你这个检测)

再比如,看不出你最大最小值是怎么定义的,既不是速度的真实最大最小值,又不是速度绝对值的最大最小值

在比如后面 那个 double* 指针,完全应该考虑在这个函数内定义吧
离线peterxj108

只看该作者 6楼 发表于: 2010-08-05
回 5楼(dbzhang800) 的帖子
take再set这个方法是老师告诉我的,目的只是为了把那一项数值取出来。take会有一种删行效果,所以要set回去。
我没有考虑速度是否为负的情况,因为地震勘探我们还碰不上负速度之类的东西。这个速度检查,只要最大速度比最小速度大,而且输入的确实是数字就算通过。
离线dbzhang800

只看该作者 7楼 发表于: 2010-08-05
Re:回 5楼(dbzhang800) 的帖子
引用第6楼peterxj108于2010-08-05 09:23发表的 回 5楼(dbzhang800) 的帖子 :
take再set这个方法是老师告诉我的,目的只是为了把那一项数值取出来。take会有一种删行效果,所以要set回去。
我没有考虑速度是否为负的情况,因为地震勘探我们还碰不上负速度之类的东西。这个速度检查,只要最大速度比最小速度大,而且输入的确实是数字就算通过。

1. 我知道 take 和 set 的作用,所以才有此一问。只是目的只是取值的话,完全没必要这么做,你代码的后半部分不是也涉及取值么,不也没take然后set么?
2. 我更不清楚了,速度检查的目的是什么,不就是防止输入错误吗。既然要求正实数,显然应该只能让正实数通过你的通过。不然别人输个  -3 都通过,算不算校验失效?
    话说回来,只是要校验正实数,是非常简单实现的(比你现在的简单多了)。 直接去判读 toDouble() 是不是大于0 就行了(连你的Ok都能省)

   当然,最好的办法,是用Qt提供的 validate,用户直接无法输入 正 实数外的数字或字符。


离线peterxj108

只看该作者 8楼 发表于: 2010-08-06
回 7楼(dbzhang800) 的帖子
对,我来我发现不必按老师的说法做,不过前面当时我就用了老师的代码,所以没改。
我现在基本上把Qt当成一个C++开发工具在用,所以很多Qt特征的东西我都不知道。关于Qt的validate,你不提这个东西之前我根本不知道有这么个东西,听你这么说这个用处应该很大,谢谢啦。
快速回复
限100 字节
 
上一个 下一个