Ver Mensaje Individual
  #9 (permalink)  
Antiguo 01/08/2016, 16:32
eferion
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 7 meses
Puntos: 204
Respuesta: Qt: Personalizar QLineEdit

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
  1. #include <QLineEdit>
  2.  
  3. class QLabel;
  4.  
  5. class LineEdit2
  6.     : public QLineEdit
  7. {
  8.     Q_OBJECT
  9.  
  10. public:
  11.     LineEdit2(
  12.             QWidget* parent = nullptr);
  13.  
  14.     ~LineEdit2();
  15.  
  16.     void SetLabelOffset(int offset);
  17.  
  18.     int GetLabelOffset() const;
  19.  
  20.     void SetMultiplier(double value);
  21.  
  22.     double GetMultiplier() const;
  23.  
  24.     double GetValue() const;
  25.  
  26. private:
  27.  
  28.     QLabel* _label;
  29.     int _labelOffset;
  30.  
  31.     double _multiplier;
  32.  
  33.     void resizeEvent(QResizeEvent *event) override;
  34.  
  35. private slots:
  36.  
  37.     void UpdateValue();
  38.     void UpdatePosition();
  39. };
  40.  
  41. LineEdit2::LineEdit2(QWidget *parent)
  42.     : QLineEdit(parent),
  43.       _label(new QLabel(this)),
  44.       _labelOffset(50),
  45.       _multiplier(1.0)
  46. {
  47.   _label->setText("0.00");
  48.   _label->setAlignment(Qt::AlignRight | Qt::AlignHCenter);
  49.   _label->setStyleSheet("color: darkred");
  50.  
  51.   setValidator(new QIntValidator(this));
  52.  
  53.   connect(this,SIGNAL(editingFinished()),SLOT(UpdateValue()));
  54. }
  55.  
  56. LineEdit2::~LineEdit2()
  57. {
  58.  
  59. }
  60.  
  61. void LineEdit2::SetLabelOffset(int offset)
  62. {
  63.   if( _labelOffset != offset )
  64.   {
  65.     _labelOffset = offset;
  66.     UpdatePosition();
  67.   }
  68. }
  69.  
  70. int LineEdit2::GetLabelOffset() const
  71. {
  72.   return _labelOffset;
  73. }
  74.  
  75. void LineEdit2::SetMultiplier(double value)
  76. {
  77.   if( _multiplier != value )
  78.   {
  79.     _multiplier = value;
  80.     UpdateValue();
  81.   }
  82. }
  83.  
  84. double LineEdit2::GetMultiplier() const
  85. {
  86.   return _multiplier;
  87. }
  88.  
  89. double LineEdit2::GetValue() const
  90. {
  91.   return _label->text().toDouble();
  92. }
  93.  
  94. void LineEdit2::resizeEvent(QResizeEvent *event)
  95. {
  96.   QLineEdit::resizeEvent(event);
  97.   UpdatePosition();
  98. }
  99.  
  100. void LineEdit2::UpdateValue()
  101. {
  102.   auto value = text().toDouble();
  103.   auto text = QString::number(value*_multiplier,'f',2);
  104.   auto pos = text.indexOf('.');
  105.   if( pos < 0 )
  106.     text += ".00";
  107.   else
  108.     text += QString(pos+3-text.length(),'0');
  109.  
  110.   _label->setText(text);
  111. }
  112.  
  113. void LineEdit2::UpdatePosition()
  114. {
  115.   _label->move(width()-_labelOffset,1);
  116.   _label->resize(_labelOffset-1,height()-2);
  117. }

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 original
  1. struct Base
  2. {
  3.     void func(){}
  4. };
  5.  
  6. struct Derivada : public Base
  7. {
  8.     void func() = delete;
  9. };
  10.  
  11. int main()
  12. {
  13.     Derivada* d = new Derivada;
  14.     Base* b = d;
  15.    
  16.     d->func(); // Error de compilación
  17.     b->func(); // OK
  18. }

Un saludo.
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.