当前位置:编程学习 > wap >>

都说Qt强大,遇到当下的问题,我真不敢相信Qt的可靠性?

本人是最近才学习用 Qt 做东西,不知道是自己的基础太差,还是什么问题。下面的问题显得非常不可思议。

我想要做一个这样的界面:


定义一个由10个坚直的滑块形成的控件:

(代码段1)

    class CurveBase : public QWidget  
    {  
        Q_OBJECT  
      
    public:  
        explicit CurveBase(QWidget *parent = 0);  
        ~CurveBase();  
        void SetRange( qint16 min , qint16 max , bool dot = false ); //设置值的范围  
      
    public slots:  
      
    signals:  
      
    private:  
        QVector< QPointer<QLabel> > m_lables;
        QVector< QPointer<QSlider> > m_sliders;  
      
        qint16 m_value_min;    //最小值  
        qint16 m_value_max;    //最大值  
    };  


CurveBase,里面有一个 m_lables , m_sliders 成员变量。

m_sliders为10个滑块控制器。


然后看定义一个NormalCurve类,该类出包换一个CurveBase成员变量。

(代码段2)



    class NormalCurve : public QDialog  
    {  
        Q_OBJECT  
    public:  
        explicit NormalCurve(QString title , QString unit ,  
                             qint16 min , qint16 max , bool dot ,  
                             const QVector<qint16> & srcData , QDialog *parent = 0);  
        ~NormalCurve();  
      
        static  QVector<qint16> SetCurve( QString title , QString unit ,  
                                          qint16 min , qint16 max , bool dot ,  
                                          const QVector<qint16> & srcData , QDialog *parent = 0);  
      
    signals:  
        void    UpdateCurveDatas( const QVector<qint16> & datas );  
        void    UpdateCurveData( quint8 index , qint16 value );  
      
    public slots:  
      
    private:  
        void    BuildWidget(void);  
      
        qint16                  m_min, m_max;  
        bool                    m_dot;  
        quint8                  m_focus_on;  
        QVector<qint16>         m_data;  
      
        //Widget  
        QPointer<CurveBase>     m_curve;  
      
    };  


可见 NormalCurve 类中有一个 Vector m_data 元素,还有一个 quint8 m_focus_on 成员变量。


现在,我在 main() 中调用

(代码段3)

    int main(int argc, char *argv[])  
    {  
        QApplication a(argc,argv);  
      
        QTextCodec::setCodecForTr(QTextCodec::codecForName("utf8"));//设置中文字体编码  
      
        QVector<qint16> vect(10,137);  
      
        NormalCurve dlg (QObject::tr(""), QObject::tr(""), 125, 160, true, vect );  
      
        dlg.show();  
      
        return a.exec();  
    }  


1、首先定义一个 vect 容器,vect(10, 137),就是向容器里装 10 个 值为 137 的 qint16 类型的元素。

2、定义一个 NormalCurve 类型的 dlg ,并显示。

3、然后,我打印一下 vect 容器内的所有元素的值。


当dlg 被实例化时,就会调用 NormalCurve 的构造函数,问题就出在 可以 NormalCurve 构造函数上。该函数的实现如下:


    NormalCurve::NormalCurve(QString title , QString unit ,  
                             qint16 min , qint16 max , bool dot ,  
                             const QVector<qint16> & srcData , QDialog *parent) :  
        QDialog(parent)  
    {     
        m_data.resize(10);  
      
        for ( int i = 0 ; i < 10 ; i ++ ){  
            if (srcData[i] >= min && srcData[i] <= max){  
                m_data[i] = srcData[i];  
            }  
        }  
      
        BuildWidget();  
      
        m_curve->SetRange(min,max,dot);   //问题就在这句上!!!!!!!!!
      
    }  


在程序执行到这个函数时,min = 125 , max = 160 , srcData[0~9] = 137;

在for 循环中 m_data[0~9] 的值都被赋成了 137 。 

可就是调用了 m_curve->SetRange( min, max , dot ) 后,m_data[0~9] 的值全变成了 125 去了。而且,m_focus_on 变成了 9.

我想不明白的是,调用 m_curve 的成员函数,怎么会改变 m_data 与 m_focus_on 的值呢?


m_curve->SetRange() 函数的具体实现如下 :


    void CurveBase::SetRange( qint16 min , qint16 max , bool isDot ) //设置值的范围  
    {  
        m_value_min = min;  
        m_value_max = max;  
      
        for (int i = 0 ; i < 10 ; i ++){  
            m_sliders[i]->setRange(min, max);     //这句话的调用出现了非常不可思议的数据篡改操作!!!!
        }  
      
        ……  
    }  


特别指出,NormalCurve::m_data[0~9] 的值是在 CurveBase::SetRange 函数作 m_sliders[i]->setRange( min , max ) 时被改变的。
同时被改变的还有 NormalCurve::m_focus_on 。


请 Qt 达人指点,我真是无计可施了。 --------------------编程问答-------------------- 这个应该不是qt的问题,是你指针或者数组操作越界失误造成的。 --------------------编程问答-------------------- 我给你YES --------------------编程问答-------------------- 查问题要从自身开始,一般都是自己的错误造成的。
建议仔细检查和调试源码。 --------------------编程问答-------------------- 貌似你的m_curve需要初始化吧?呵呵 --------------------编程问答-------------------- 先自己单步调试下,看看自己有没有问题
引用 4 楼 two_ears 的回复:
貌似你的m_curve需要初始化吧?呵呵
--------------------编程问答-------------------- 滚动条应该不会遇到过这种奇怪问题,debug一下指针数组看看是不是地址已经飞掉了。而且你贴出的代码里面有些东西没有初始化,不知道是不是因为没有贴的原因。 --------------------编程问答-------------------- 这么多人用都没问题 还是检查一下你的代码吧 --------------------编程问答-------------------- 偏激了 --------------------编程问答-------------------- 先从自身找问题。
在C++中,使用未初始化的东西是低级错误。 --------------------编程问答-------------------- 还是先找找自己原因吧。 --------------------编程问答--------------------
引用 4 楼 two_ears 的回复:
貌似你的m_curve需要初始化吧?呵呵


很明显没有初始化! --------------------编程问答-------------------- 可怜的楼主,·m_curve->SetRange(min,max,dot);   //问题就在这句上!!!!!!!!!
你自己都说出了问题

你的m_curve有没有new出来一个啊?你既然定义成QPointer<...>了。好歹也得new出来啊
补充:移动开发 ,  Qt
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,