Как правильно понимать QSizePolicy?
От: baf  
Дата: 13.12.11 17:54
Оценка:
Не могу понять как сделать потомка QWidget, такого, чтобы вёл себы в QHBoxLayout как кнопка. Т.е. был фиксирован по высоте, не сжимался бы по ширине меньше заданного размера, и растягивался по ширине на всю область.
Переопределил метод sizeHint():

QSize SOFMWidget::sizeHint()
{
    return QSize(img.width(), img.height());
}


установил QSizePolicy в конструкторе:
SOFMWidget::SOFMWidget(QWidget *parent) :
    QWidget(parent), m_sofm(0)
{
    setSizePolicy(QSizePolicy::Fixed, QSizePolicy::MinimumExpanding);
}


Но не работает. При изменении размеров окна которое содержит мой виджет — мой виджет меняется произвольно. Хотя кнопка ведёт себя как нужно.

Пожалуйста, помогите разобраться. Видимо, я категорически неправильно понимаю QSizePolicy :???:
Re: Как правильно понимать QSizePolicy?
От: romankr  
Дата: 14.12.11 10:33
Оценка:
Здравствуйте, baf, Вы писали:

baf>Не могу понять как сделать потомка QWidget, такого, чтобы вёл себы в QHBoxLayout как кнопка. Т.е. был фиксирован по высоте, не сжимался бы по ширине меньше заданного размера, и растягивался по ширине на всю область.

baf>Переопределил метод sizeHint():

baf>
baf>QSize SOFMWidget::sizeHint()
baf>{
baf>    return QSize(img.width(), img.height());
baf>}
baf>


baf>установил QSizePolicy в конструкторе:

baf>
baf>SOFMWidget::SOFMWidget(QWidget *parent) :
baf>    QWidget(parent), m_sofm(0)
baf>{
baf>    setSizePolicy(QSizePolicy::Fixed, QSizePolicy::MinimumExpanding);
baf>}
baf>


baf>Но не работает. При изменении размеров окна которое содержит мой виджет — мой виджет меняется произвольно. Хотя кнопка ведёт себя как нужно.


baf>Пожалуйста, помогите разобраться. Видимо, я категорически неправильно понимаю QSizePolicy


я думаю, логично было бы внимательно посмотреть SizePolicy у дефолтной кнопки В данном случае вы немного перепутали, надо вот так:
setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed);

К тому же, есть вот еще один момент.
> Т.е. был фиксирован по высоте, не сжимался бы по ширине меньше заданного размера,
минимальный размер можно выставит руками с помощью функции setMinimumSize().
Re[2]: Как правильно понимать QSizePolicy?
От: baf  
Дата: 14.12.11 20:08
Оценка:
Здравствуйте, romankr, Вы писали:

R>я думаю, логично было бы внимательно посмотреть SizePolicy у дефолтной кнопки ;) В данном случае вы немного перепутали, надо вот так:

R>
R>setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed);
R>


Да, и правда, перепутал. Но этот вариант тоже не работает.

R>К тому же, есть вот еще один момент.

>> Т.е. был фиксирован по высоте, не сжимался бы по ширине меньше заданного размера,
R>минимальный размер можно выставит руками с помощью функции setMinimumSize().
Я сделал по другому — перегрузил minimumSizeHint().

Проблема ещё в том, что sizeHint — у виджета меняется. И так как у кнопки, — когда её размер меняется (допустим при изменении текста), то менеджер компоновки под него подстраивается, — у меня сделать с моим виджетом не получается.

  пример иллюстрирующий поведение кнопки, которое я хочу реализовать в своём виджете
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

class QPushButton;

class Widget : public QWidget
{
    Q_OBJECT
public:
    Widget(QWidget *parent = 0);

private:
    QPushButton *m_btn;

private slots:
    void changeBtnText(QString text);
};

#endif // WIDGET_H


#include "widget.h"

#include <QVBoxLayout>
#include <QLineEdit>
#include <QPushButton>
#include <QVBoxLayout>
#include <QHBoxLayout>

Widget::Widget(QWidget *parent)
    : QWidget(parent),
      m_btn(new QPushButton("btn"))
{
    QPushButton *btn2 = new QPushButton("btn #2");

    QLineEdit *lineEdit = new QLineEdit;
    connect(lineEdit, SIGNAL(textChanged(QString)), SLOT(changeBtnText(QString)));

    QHBoxLayout *btnLay = new QHBoxLayout;
    btnLay->addWidget(m_btn);
    btnLay->addWidget(btn2,1);

    QVBoxLayout *mainLay = new QVBoxLayout;
    mainLay->addLayout(btnLay);
    mainLay->addWidget(lineEdit);

    setLayout(mainLay);
}

void Widget::changeBtnText(QString text)
{
    m_btn->setText(text);
}


Да, надо видимо поковырять код QPushButton в исходниках библиотеки, но толком не понимая принципа сложновато это делать, для этого ещё QLayout и иже с ним ковырять придёться.
Может кто-нибудь уже знает решение моей проблемы?

Моя же задача такая: пользователь открывает картинку из файла, она должна в моём виджете отобразиться, а мой виджет под неё подстроиться. Мой виджет в QHBoxLayout скомпонован с панелью управления. Сейчас мой виджет не меняет размеров и приходиться ручками окно маштабировать, чтобы картинку увидеть.
Re: Как правильно понимать QSizePolicy?
От: Аноним  
Дата: 15.08.12 22:46
Оценка:
У меня пошло!
применял для виджета напрямую.


QWidget *W2 = new QWidget(mainWidget);
 W2->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed);
layout->addWidget(W2);


учитывая заданные минимальные размеры у меня выглядит все ок.
Re[2]: Как правильно понимать QSizePolicy?
От: Аноним  
Дата: 03.06.14 12:27
Оценка:
baf, как решил проблему?
Re: Как правильно понимать QSizePolicy?
От: Honduras  
Дата: 07.10.16 17:55
Оценка:
Здравствуйте, baf, Вы писали:

baf>Как правильно понимать QSizePolicy?


я вообще никак не понимаю

http://www.studfiles.ru/preview/2649546/page:40/

Expanding
Виджет может быть больше или меньше значения, возвращаемого мето-
дом sizeHint(), но класс компоновки постарается предоставлять видже-
ту как можно больше места. Другими словами, виджет может как растяги-
ваться, так и сжиматься, но предпочтительнее его растягивать


Ignored
Значение, возвращаемое методом sizeHint(), не принимается во вни-
мание. Однако класс компоновки постарается предоставлять виджету как
можно больше места


в чем разница? Это при том что sizeHint 3 — мин, мах и просто, но про них в доках ни слова
Re[3]: Как правильно понимать QSizePolicy?
От: SaZ  
Дата: 07.10.16 23:53
Оценка:
Здравствуйте, baf, Вы писали:

baf>Проблема ещё в том, что sizeHint — у виджета меняется. И так как у кнопки, — когда её размер меняется (допустим при изменении текста), то менеджер компоновки под него подстраивается, — у меня сделать с моим виджетом не получается.


Надо понимать, чт hint — это подсказка, а не обязательно размер.

baf>Может кто-нибудь уже знает решение моей проблемы?


Выставить правильно QSizePolicy (как выше советовали) и играться в первую очередь с лэйаутами, а не с сайзхинтами. Обратите внимание на методы в лэйауте, которые содержат слова stretch factor. Главное понять, что либо setFixedSize, либо управлять через лэйауты + сайзполиси.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.