Veo que xKuZz se me adelantó por unos minutos... aun así te pongo mi propuesta para que no caiga en saco roto :)
Las dos versiones son bastante parecidas aunque cada una tiene sus ventajas.
Código C++:
Ver original#include <QLineEdit>
class QLabel;
class LineEdit2
: public QLineEdit
{
Q_OBJECT
public:
LineEdit2(
QWidget* parent = nullptr);
~LineEdit2();
void SetLabelOffset(int offset);
int GetLabelOffset() const;
void SetMultiplier(double value);
double GetMultiplier() const;
double GetValue() const;
private:
QLabel* _label;
int _labelOffset;
double _multiplier;
void resizeEvent(QResizeEvent *event) override;
private slots:
void UpdateValue();
void UpdatePosition();
};
LineEdit2::LineEdit2(QWidget *parent)
: QLineEdit(parent),
_label(new QLabel(this)),
_labelOffset(50),
_multiplier(1.0)
{
_label->setText("0.00");
_label->setAlignment(Qt::AlignRight | Qt::AlignHCenter);
_label->setStyleSheet("color: darkred");
setValidator(new QIntValidator(this));
connect(this,SIGNAL(editingFinished()),SLOT(UpdateValue()));
}
LineEdit2::~LineEdit2()
{
}
void LineEdit2::SetLabelOffset(int offset)
{
if( _labelOffset != offset )
{
_labelOffset = offset;
UpdatePosition();
}
}
int LineEdit2::GetLabelOffset() const
{
return _labelOffset;
}
void LineEdit2::SetMultiplier(double value)
{
if( _multiplier != value )
{
_multiplier = value;
UpdateValue();
}
}
double LineEdit2::GetMultiplier() const
{
return _multiplier;
}
double LineEdit2::GetValue() const
{
return _label->text().toDouble();
}
void LineEdit2::resizeEvent(QResizeEvent *event)
{
QLineEdit::resizeEvent(event);
UpdatePosition();
}
void LineEdit2::UpdateValue()
{
auto value = text().toDouble();
auto text = QString::number(value*_multiplier,'f',2);
auto pos = text.indexOf('.');
if( pos < 0 )
text += ".00";
else
text += QString(pos+3-text.length(),'0');
_label->setText(text);
}
void LineEdit2::UpdatePosition()
{
_label->move(width()-_labelOffset,1);
_label->resize(_labelOffset-1,height()-2);
}
Lo de deshabilitar el acceso a los métodos no lo he puesto porque tirando de polimorfismo se pueden seguir llamando a las funciones, aunque no deja de ser una pequeña barrera para evitar accesos no deseados:
Código C++:
Ver originalstruct Base
{
void func(){}
};
struct Derivada : public Base
{
void func() = delete;
};
int main()
{
Derivada* d = new Derivada;
Base* b = d;
d->func(); // Error de compilación
b->func(); // OK
}
Un saludo.