Russian Qt Forum

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



Название: Изменение размеров родительского виджета при изменении размера одного из детей
Отправлено: PulSar.CE3194694 от Февраль 08, 2013, 19:31
Добрый вечер.
Есть некоторый виджет. В нем для размещения детей использован QFormLayout. В этот лэйаут помещаются QLabel. Текст любого из этих лейблов можно редактировать. Я изменил текст и лейбел стал (например) длиннее. Вопрос: как сделать без костылей так, чтобы родительский виджет изменил свои размеры (в данном случае ширину) в соответствии с размером (шириной) этого лейбла? (подразумевается, что этот лейбел стал самым широким из всех присутствующих и естественно должен поместиться на родительском виджете, а не быть визуально обрезанным).
Методы типи adjustSize(), QFormLayout::update() как-то не помогают. А другого по данной теме вроде не нашел.


Название: Re: Изменение размеров родительского виджета при изменении размера одного из детей
Отправлено: GreatSnake от Февраль 08, 2013, 22:36
Компилируемый пример в студию)


Название: Re: Изменение размеров родительского виджета при изменении размера одного из детей
Отправлено: PulSar.CE3194694 от Февраль 12, 2013, 18:48
Примера нет. Тут и так расписано что нужно.
Здесь наверное надо что-то с layout делать, но что?


Название: Re: Изменение размеров родительского виджета при изменении размера одного из детей
Отправлено: Igors от Февраль 12, 2013, 19:44
Примера нет. Тут и так расписано что нужно.
Здесь наверное надо что-то с layout делать, но что?
Не умничайте. Просто дайте GreatSnake чего надо растянуть и получите решение (это ж акула UI  :))


Название: Re: Изменение размеров родительского виджета при изменении размера одного из детей
Отправлено: PulSar.CE3194694 от Февраль 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);
}
Как-то так.


Название: Re: Изменение размеров родительского виджета при изменении размера одного из детей
Отправлено: GreatSnake от Февраль 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();
}
};