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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Изменение размеров родительского виджета при изменении размера одного из детей  (Прочитано 5495 раз)
PulSar.CE3194694
Гость
« : Февраль 08, 2013, 19:31 »

Добрый вечер.
Есть некоторый виджет. В нем для размещения детей использован QFormLayout. В этот лэйаут помещаются QLabel. Текст любого из этих лейблов можно редактировать. Я изменил текст и лейбел стал (например) длиннее. Вопрос: как сделать без костылей так, чтобы родительский виджет изменил свои размеры (в данном случае ширину) в соответствии с размером (шириной) этого лейбла? (подразумевается, что этот лейбел стал самым широким из всех присутствующих и естественно должен поместиться на родительском виджете, а не быть визуально обрезанным).
Методы типи adjustSize(), QFormLayout::update() как-то не помогают. А другого по данной теме вроде не нашел.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



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

Компилируемый пример в студию)
Записан

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

Примера нет. Тут и так расписано что нужно.
Здесь наверное надо что-то с layout делать, но что?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Февраль 12, 2013, 19:44 »

Примера нет. Тут и так расписано что нужно.
Здесь наверное надо что-то с layout делать, но что?
Не умничайте. Просто дайте GreatSnake чего надо растянуть и получите решение (это ж акула UI  Улыбающийся)
Записан
PulSar.CE3194694
Гость
« Ответ #4 : Февраль 12, 2013, 19:58 »

Код:
MyWidget::MyWidget(QWidget*parent) : QFrame(parent)
{
    p_palette.setColor(QPalette::Window, Qt::white);
    this->setPalette(p_palette);
    this->setAutoFillBackground(true);
    this->setFrameShape(QFrame::Box);
    this->setLineWidth(1);
    fLayout = new QFormLayout(this);
    fLayout->setContentsMargins(5,5,5,5);
    this->setLayout(fLayout);
    p_flags = Qt::TextEditable | Qt::TextSelectableByMouse;
}

MyWidget::~MyWidget()
{
    delete fLayout;
}

void MyWidget::addLabels()
{
    QLabel *label = new QLabel("Editable Label", this);
    label->setTextInteractionFlags(p_flags);
    label->setMinimumHeight(15);
    QFont font = label->font();
    font.setPointSize(11);
    label->setFont(font);
    label->adjustSize();
    QLabel *label2 = new QLabel("ShowLabel", this);
    label2->setMinimumSize(20,label->height());
    fLayout->addRow(label2, label);
}
Как-то так.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



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

Без костылей никак не получится.
Попробуй для редактируемого лейбла такой класс:
Код
C++ (Qt)
#include <QLineEdit>
 
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();
}
};
Записан

Qt 5.11/4.8.7 (X11/Win)
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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