首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >提升类QDoubleSpinBox的内存泄漏

提升类QDoubleSpinBox的内存泄漏
EN

Stack Overflow用户
提问于 2022-08-01 08:25:21
回答 1查看 42关注 0票数 0

我正在提升QDoubleSpinBox类,因为我希望捕获mouseDoubleClick事件。

这是升级班。

代码语言:javascript
复制
class SumDoubleBox : public QDoubleSpinBox
{
    Q_OBJECT
public:

    explicit SumDoubleBox(QWidget* parent = nullptr);   
    void setSingleStep(double val);
    double singleStep() const;
    void stepBy(int steps) override;
protected:
    virtual void focusInEvent(QFocusEvent *e) override;         
public slots:       
    void setZero();
    void setOne();

signals:
    int signalUndoRedo();

private:
    double m_defaultStep = 1.0;
    double m_CurrentStep;
    bool m_stepUp;
};



SumDoubleBox::SumDoubleBox(QWidget* parent) : QDoubleSpinBox(parent)
{
    SumLineEdit* lineEdit = new SumLineEdit(this);
    setLineEdit(lineEdit);
    setMinimum(0.0);
    setMaximum(99999.0);
}

因为我要在SumDoubleBox类的构造函数中创建一个指针。

代码语言:javascript
复制
  SumLineEdit* lineEdit = new SumLineEdit(this);

是否需要在析构函数中显式删除此内容?

///////////////////////////////////////////////////////////////// SumLineEdit类的定义。

代码语言:javascript
复制
class SumLineEdit : public QLineEdit
{
    Q_OBJECT

public:
    explicit SumLineEdit(QWidget* parent = nullptr) {   };
protected:
    void mouseDoubleClickEvent(QMouseEvent* event) override;
};


void SumLineEdit::mouseDoubleClickEvent(QMouseEvent* event)
{
    if (event->button() == Qt::LeftButton)
    {
        selectAll();
        event->accept();
        return;
    }
    QLineEdit::mouseDoubleClickEvent(event);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-01 10:21:35

因为您已经将新的lineedit父系给SumDoubleBox,所以它应该与其父程序一起被删除。

但是,有一种更以Qt为中心的方法来处理这种情况,我强烈建议您使用或至少研究一下:在内置行编辑和处理事件的过程中安装一个事件过滤器。我做了许多派生盒变体,这种方法通常效果最好:

代码语言:javascript
复制
SumDoubleBox::SumDoubleBox( QWidget *parent ) :
    QDoubleSpinBox( parent )
{
    lineEdit()->installEventFilter( this );
}


bool SumDoubleBox::eventFilter( QObject *object, QEvent *event )
{
    if( object == lineEdit() && event->type() == QEvent::MouseButtonDblClick )
    {
        QMouseEvent *mouseEvent = static_cast<QMouseEvent*>( event );
        if( mouseEvent->button() == Qt::LeftButton )
        {
            selectAll();
            event->accept();
            return true; //swallow the event
        }

    }
    return false; //let the event through to the lineedit
}

这使得自定义类完全冗余。这很好,因为继承是一个很大的锤子,很容易随着代码库的扩展而失控,如果有其他更简单的方法来实现您的目标,它通常是值得考虑的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73190831

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档