Russian Qt Forum

Qt => Вопросы новичков => Тема начата: PulSar.CE3194694 от Февраль 19, 2013, 22:12



Название: Подогнать QLineEdit под размер строки
Отправлено: PulSar.CE3194694 от Февраль 19, 2013, 22:12
Добрый день.
Проблема такая: есть QLineEdit с некоторым минимально возможным размером, в которую вставлен текст по умолчанию. Пользователь начинает редактировать строку текста, и когда очередной символ уже не вмещается в QLineEdit, она увеличивается в ширину на ширину введенного символа. Никак не получается правильно есть сделать, долблю 2й вечер.
Код прилагается, может поможете с решением.
Код:
void Edit::changeWidth(const QString &text) //слот
{
    int textWidth = p_fm->width(text)+p_startTextWidth/2; // p_fm = new QFontMetrics(p_inputField->font());
                                                                                //p_inputField = new QLineEdit("someText");
                                                                                //p_startTextWidth = p_fm->width("someText"); ширина начального текста, чушь, но у меня без него не работает...
    if(textWidth > p_inputField->width())
    {
        p_inputField->setFixedWidth(textWidth);
        qDebug()<<textWidth << p_inputField->width();
    }
}
В общем вместо того, чтобы вмещать весь введенный текст, текст начинает с каждым новым вводимым символом уезжать влево на 1 пиксель.


Название: Re: Подогнать QLineEdit под размер строки
Отправлено: GreatSnake от Февраль 20, 2013, 07:26
Тебе же здесь (http://www.prog.org.ru/index.php?topic=24139.msg171697#msg171697) дали решение.
Кстати, мог бы как-то и отреагировать.


Название: Re: Подогнать QLineEdit под размер строки
Отправлено: Igors от Февраль 20, 2013, 10:36
Пользователь начинает редактировать строку текста, и когда очередной символ уже не вмещается в QLineEdit, она увеличивается в ширину на ширину введенного символа.
При работе с UI полезно задавать себе вопрос "а как люди делают?". Ну или "а почему никто не делает так как я хочу?". Стоит попробовать - и Вы быстро найдете массу ответов  :) 


Название: Re: Подогнать QLineEdit под размер строки
Отправлено: PulSar.CE3194694 от Февраль 20, 2013, 16:17
Тебе же здесь (http://www.prog.org.ru/index.php?topic=24139.msg171697#msg171697) дали решение.
Кстати, мог бы как-то и отреагировать.
Значит не увидел ответа. Кстати, не работает так как надо. Я же говорю, при добавлении нового символа в QLineEdit весь введенный текст съезжает влево (по крайней мере так кажется визуально).
Igors, не умничайте.


Название: Re: Подогнать QLineEdit под размер строки
Отправлено: PulSar.CE3194694 от Февраль 20, 2013, 16:49
Теперь ясно стало, почему текст плывет. ФонтМетрика не учитывает расстояния между буквами и поэтому всякие методы вроде boundingRect().width(), width() и т.п. показывают длину текста не верно.
Код:
int textWidth = fontMetrics.width(text) + text.size() -1


Название: Re: Подогнать QLineEdit под размер строки
Отправлено: GreatSnake от Февраль 20, 2013, 17:02
Кстати, не работает так как надо. Я же говорю, при добавлении нового символа в QLineEdit весь введенный текст съезжает влево (по крайней мере так кажется визуально).
Вот работающий пример на основе твоего кода (http://www.prog.org.ru/index.php?topic=24139.msg171545#msg171545):
Код
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().


Название: Re: Подогнать QLineEdit под размер строки
Отправлено: PulSar.CE3194694 от Февраль 20, 2013, 18:01
Потому что не считались расстояния между буквами.
В общем тот код, что был приведен почти что == с тем, что был в начале темы кроме этого:
Код:
fontMetrics().boundingRect(text).width()
а у меня было:
Код:
p_fm = new QFontMetrics(p_inputField->font());
p_fm->boundingRect(text).width()
Забавно, но использовав первый вариант, движение текста прекратилось...