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

临峰不畏 2011-12-27 10:10:26
本人是最近才学习用 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 达人指点,我真是无计可施了。
...全文
805 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
donwmufromdying 2012-01-05
  • 打赏
  • 举报
回复
可怜的楼主,·m_curve->SetRange(min,max,dot); //问题就在这句上!!!!!!!!!
你自己都说出了问题

你的m_curve有没有new出来一个啊?你既然定义成QPointer<...>了。好歹也得new出来啊
奔跑吧猴哥 2012-01-04
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 two_ears 的回复:]

貌似你的m_curve需要初始化吧?呵呵
[/Quote]

很明显没有初始化!
奔跑吧猴哥 2012-01-04
  • 打赏
  • 举报
回复
还是先找找自己原因吧。
facat 2011-12-31
  • 打赏
  • 举报
回复
这么多人用都没问题 还是检查一下你的代码吧
凡员外 2011-12-31
  • 打赏
  • 举报
回复
偏激了
pilgrim_kevin 2011-12-31
  • 打赏
  • 举报
回复
先从自身找问题。
在C++中,使用未初始化的东西是低级错误。
zephirus_forever 2011-12-29
  • 打赏
  • 举报
回复
滚动条应该不会遇到过这种奇怪问题,debug一下指针数组看看是不是地址已经飞掉了。而且你贴出的代码里面有些东西没有初始化,不知道是不是因为没有贴的原因。
dq 2011-12-29
  • 打赏
  • 举报
回复
先自己单步调试下,看看自己有没有问题
[Quote=引用 4 楼 two_ears 的回复:]
貌似你的m_curve需要初始化吧?呵呵
[/Quote]
two_ears 2011-12-29
  • 打赏
  • 举报
回复
貌似你的m_curve需要初始化吧?呵呵
Lutx 2011-12-28
  • 打赏
  • 举报
回复
查问题要从自身开始,一般都是自己的错误造成的。
建议仔细检查和调试源码。
一起逛钟楼啊 2011-12-27
  • 打赏
  • 举报
回复
我给你YES
三条猫 2011-12-27
  • 打赏
  • 举报
回复
这个应该不是qt的问题,是你指针或者数组操作越界失误造成的。

16,816

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧