都说Qt强大,遇到当下的问题,我真不敢相信Qt的可靠性?
本人是最近才学习用 Qt 做东西,不知道是自己的基础太差,还是什么问题。下面的问题显得非常不可思议。
我想要做一个这样的界面:
定义一个由10个坚直的滑块形成的控件:
(代码段1)
CurveBase,里面有一个 m_lables , m_sliders 成员变量。
m_sliders为10个滑块控制器。
然后看定义一个NormalCurve类,该类出包换一个CurveBase成员变量。
(代码段2)
可见 NormalCurve 类中有一个 Vector m_data 元素,还有一个 quint8 m_focus_on 成员变量。
现在,我在 main() 中调用
(代码段3)
1、首先定义一个 vect 容器,vect(10, 137),就是向容器里装 10 个 值为 137 的 qint16 类型的元素。
2、定义一个 NormalCurve 类型的 dlg ,并显示。
3、然后,我打印一下 vect 容器内的所有元素的值。
当dlg 被实例化时,就会调用 NormalCurve 的构造函数,问题就出在 可以 NormalCurve 构造函数上。该函数的实现如下:
在程序执行到这个函数时,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() 函数的具体实现如下 :
特别指出,NormalCurve::m_data[0~9] 的值是在 CurveBase::SetRange 函数作 m_sliders[i]->setRange( min , max ) 时被改变的。
同时被改变的还有 NormalCurve::m_focus_on 。
请 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表头支持多列显示,功能强大
QT框架是Qt公司开发的一款强大的跨平台应用程序开发框架,它广泛应用于GUI(图形用户界面)设计,同时也支持命令行和其他非GUI应用。
史上最强大最全面的qt教程手册
史上最强大最全面的qt教程手册,Qt是Linux桌面环境KDE的基础。笔者认为,可以说Qt与Windows下的Mfc的实质是一样的,所以Qt最大的优点在于其跨平台性,可以支持现有的多种操作系统平台,主
qt界面_qt软件框架_qt界面框架_C++_qt界面_QT_
QT是Qt Company开发的一种跨平台应用程序开发框架,广泛用于创建图形用户界面(GUI)和非GUI应用程序。
QT画图工具的简单实现
QT框架,全称为Qt Application Framework,是由Trolltech公司(现为The Qt Company)开发的跨平台应用程序开发框架,广泛应用于C++编程。
qt二维地图 qt图像显示框架
在IT领域,Qt是一个强大的跨平台应用程序开发框架,由C++编写,支持Windows、Linux、macOS、Android和iOS等多个操作系统。


