自定义Qt CustomDial控件运行时出现段错误问题咨询
问题根因
你遇到的段错误是两个核心问题共同导致的:
- 单参数构造函数
CustomDial(QWidget* parent = nullptr)没有初始化任何QSharedPointer类型的成员变量。Qt元对象系统在创建控件实例、读取你定义的Q_PROPERTY属性时,会默认调用这个带默认参数的构造函数,此时arcColor_等智能指针还处于空值状态,调用getArcColor()时对空指针解引用直接触发崩溃。 - 数值型成员
arcWidth_、startAngle_、maximumAngleSpan_没有初始化默认值,后续resizeEvent、paintEvent中直接使用会读取到内存垃圾值,也可能引发越界访问。
修复方案
- 改造单参数构造函数,委托已经实现的多参数构造完成所有成员初始化:
CustomDial::CustomDial(QWidget* parent) : CustomDial("", parent, 0, 999) {}
- 给数值型成员设置默认初始值,可以在类内定义时直接赋值:
// 头文件类内定义修改 double maximumAngleSpan_ = -360 * 16; // QPainter角度单位为1/16度 double startAngle_ = 270 * 16; double arcWidth_ = 4.0; double angleSpan_ = 0;
- 给属性读取方法加上
const修饰,符合Qt元对象系统的调用规范:
// 头文件修改 QString getArcColor() const; double getArcWidth() const; // 对应的实现也同步添加const修饰
- 补充所有缺失的成员函数实现,修改属性后调用
update()触发控件重绘:
void CustomDial::setArcColor(const QString& color) { *arcColor_ = QColor(color); arcPen_->setColor(*arcColor_); update(); } QString CustomDial::getArcColor() const { return arcColor_->name(); } void CustomDial::setArcWidth(double px) { arcWidth_ = px; arcPen_->setWidthF(arcWidth_); update(); } double CustomDial::getArcWidth() const { return arcWidth_; } void CustomDial::setStartAngle(double angle) { startAngle_ = angle * 16; update(); } double CustomDial::getStartAngle() const { return startAngle_ / 16; } void CustomDial::setMaximumAngle(double angle) { maximumAngleSpan_ = angle * 16; update(); } double CustomDial::getMaximumAngle() const { return maximumAngleSpan_ / 16; } void CustomDial::updateValue() { valueString_ = QString::number(value()); angleSpan_ = maximumAngleSpan_ * (value() - minimum()) / (maximum() - minimum()); update(); } void CustomDial::setText(const QString& text) { text_ = text; update(); } QString CustomDial::getText() const { return text_; }
内容的提问来源于stack exchange,提问作者madhavpcm
相关产品推荐
相关产品推荐

