我正在提升QDoubleSpinBox类,因为我希望捕获mouseDoubleClick事件。
这是升级班。
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类的构造函数中创建一个指针。
SumLineEdit* lineEdit = new SumLineEdit(this);是否需要在析构函数中显式删除此内容?
///////////////////////////////////////////////////////////////// SumLineEdit类的定义。
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);
}发布于 2022-08-01 10:21:35
因为您已经将新的lineedit父系给SumDoubleBox,所以它应该与其父程序一起被删除。
但是,有一种更以Qt为中心的方法来处理这种情况,我强烈建议您使用或至少研究一下:在内置行编辑和处理事件的过程中安装一个事件过滤器。我做了许多派生盒变体,这种方法通常效果最好:
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
}这使得自定义类完全冗余。这很好,因为继承是一个很大的锤子,很容易随着代码库的扩展而失控,如果有其他更简单的方法来实现您的目标,它通常是值得考虑的。
https://stackoverflow.com/questions/73190831
复制相似问题