话说Qt很强大,可当下遇到的问题也太不过思议了吧!

来源:互联网 发布:mastercam9.1车床编程 编辑:程序博客网 时间:2024/04/29 00:53

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

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


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

(代码段1)

class CurveBase : public QWidget{    Q_OBJECTpublic:    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_OBJECTpublic:    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 达人指点,我真是无计可施了。



原创粉丝点击