Russian Qt Forum
Сентябрь 29, 2024, 06:34 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Подогнать QLineEdit под размер строки  (Прочитано 8843 раз)
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 пиксель.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Февраль 20, 2013, 07:26 »

Тебе же здесь дали решение.
Кстати, мог бы как-то и отреагировать.
Записан

Qt 5.11/4.8.7 (X11/Win)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Февраль 20, 2013, 10:36 »

Пользователь начинает редактировать строку текста, и когда очередной символ уже не вмещается в QLineEdit, она увеличивается в ширину на ширину введенного символа.
При работе с UI полезно задавать себе вопрос "а как люди делают?". Ну или "а почему никто не делает так как я хочу?". Стоит попробовать - и Вы быстро найдете массу ответов  Улыбающийся 
Записан
PulSar.CE3194694
Гость
« Ответ #3 : Февраль 20, 2013, 16:17 »

Тебе же здесь дали решение.
Кстати, мог бы как-то и отреагировать.
Значит не увидел ответа. Кстати, не работает так как надо. Я же говорю, при добавлении нового символа в QLineEdit весь введенный текст съезжает влево (по крайней мере так кажется визуально).
Igors, не умничайте.
Записан
PulSar.CE3194694
Гость
« Ответ #4 : Февраль 20, 2013, 16:49 »

Теперь ясно стало, почему текст плывет. ФонтМетрика не учитывает расстояния между буквами и поэтому всякие методы вроде boundingRect().width(), width() и т.п. показывают длину текста не верно.
Код:
int textWidth = fontMetrics.width(text) + text.size() -1
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #5 : Февраль 20, 2013, 17:02 »

Кстати, не работает так как надо. Я же говорю, при добавлении нового символа в 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().
« Последнее редактирование: Февраль 20, 2013, 17:05 от GreatSnake » Записан

Qt 5.11/4.8.7 (X11/Win)
PulSar.CE3194694
Гость
« Ответ #6 : Февраль 20, 2013, 18:01 »

Потому что не считались расстояния между буквами.
В общем тот код, что был приведен почти что == с тем, что был в начале темы кроме этого:
Код:
fontMetrics().boundingRect(text).width()
а у меня было:
Код:
p_fm = new QFontMetrics(p_inputField->font());
p_fm->boundingRect(text).width()
Забавно, но использовав первый вариант, движение текста прекратилось...
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.077 секунд. Запросов: 23.