Кстати, не работает так как надо. Я же говорю, при добавлении нового символа в QLineEdit весь введенный текст съезжает влево (по крайней мере так кажется визуально).
Вот работающий пример на основе
твоего кода:
C++ (Qt)
#include <QApplication>
#include <QLabel>
#include <QLineEdit>
#include <QFormLayout>
#include <QDebug>
class EditableLabel : public QLineEdit
{
Q_OBJECT
public:
EditableLabel( QWidget* p = 0 )
: QLineEdit( p )
{
if( p )
{
QPalette pal = palette();
pal.setColor( backgroundRole(), p->palette().color( p->backgroundRole() ) );
setPalette( pal );
}
setFrame( false );
setFocusPolicy( Qt::ClickFocus );
connect( this, SIGNAL(textEdited(QString)), this, SLOT(resizeByContents()) );
}
QSize sizeHint() const
{
QRect r = fontMetrics().boundingRect( text() );
int lm, rm, tm, bm;
getTextMargins( &lm, &tm, &rm, &bm );
return QSize( r.width() + lm + rm + 5, QLineEdit::sizeHint().height() );
}
QSize minimumSizeHint() const
{
return sizeHint();
}
private Q_SLOTS:
void resizeByContents()
{
setFixedWidth( sizeHint().width() );
if( QWidget* p = parentWidget() )
p->adjustSize();
}
};
class MyWidget : public QFrame
{
Q_OBJECT
public:
MyWidget( QWidget* parent = 0 )
: QFrame( parent )
{
QPalette pal;
pal.setColor(QPalette::Window, Qt::white);
this->setPalette( pal );
this->setAutoFillBackground(true);
this->setFrameShape(QFrame::Box);
this->setLineWidth(1);
fLayout = new QFormLayout(this);
fLayout->setContentsMargins(5,5,5,5);
this->setLayout(fLayout);
}
void addLabels()
{
QLineEdit *le = new EditableLabel(this);
le->setText( "Editable Label" );
QLabel *label2 = new QLabel("ShowLabel:", this);
fLayout->addRow(label2, le);
}
private:
QFormLayout* fLayout;
};
int main( int argc, char** argv )
{
QApplication app( argc, argv );
MyWidget w;
w.addLabels();
w.show();
return app.exec();
}
Под Х-ми ничего не плывёт.
int textWidth = fontMetrics.width(text) + text.size() -1
Какой смысл к пикселям прибавлять количество символов?
Для точного определения размеров используй QFontMetrics::tightBoundingRect().