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

临峰不畏 临峰不畏 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
本人是最近才学习用 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 达人指点,我真是无计可施了。
...全文

相关推荐

评论 12
收藏 已收藏
分享
返回顶部
临峰不畏
Qt 21,503 成员 26,693 内容