Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Qt4.2.2 - запретить виджету/окну растягиваться. / 7 сообщений из 7, страница 1 из 1
24.05.2007, 17:01
    #34549212
ErV
ErV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Qt4.2.2 - запретить виджету/окну растягиваться.
Такой вопрос. В справке к Qt-4.2.2 сказано, что виджету можно запретить,
например, менять размер по горизонтали, выставив SizePolicy. Однако на
практике это почему-то "не работает" (либо я чего-то недопонимаю).
Система Slackware 11 Linux/KDE 3.5.4. Вот пример простого тестового кода:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
#include <QApplication>
#include <QPushButton>
#include <QVBoxLayout>
#include <QWidget>

class TestWidget: public QWidget{
public:
        TestWidget(QWidget *parent =  0 );
};

TestWidget::TestWidget(QWidget *parent)
:QWidget(parent){
        QPushButton *button1 = new QPushButton();
        QPushButton *button2 = new QPushButton();
        button1->setText("button1");
        button2->setText("button2");
        QVBoxLayout *layout = new QVBoxLayout();
        layout->addWidget(button1);
        layout->addWidget(button2);
        setLayout(layout);
        setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Minimum);
}

int main(int argc, char **argv){
        QApplication app(argc, argv);
        TestWidget widget;
        widget.show();
        return app.exec();
}
Полученное безобразие спокойно растягивается мышой как по вертикали, так и
по горизонтали. Хотя кнопки свой вертикальный размер не меняют. Что я
упустил?

ЗЫ. Как я понимаю, SetGeometry и SetMaximumSize лучше не трогать, так как
Виджет (как я понимаю) перестанет себя адаптировать к изменениям размеров
шрифтов и т.д, а sizeHint (вроде бы) должен определяться Layout'ом
автоматически...
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
24.05.2007, 17:45
    #34549373
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Qt4.2.2 - запретить виджету/окну растягиваться.
ErVТакой вопрос. В справке к Qt-4.2.2 сказано, что виджету можно запретить,
например, менять размер по горизонтали, выставив SizePolicy.Неправильно читаешь. Оно не запрещает менять размер. Оно определяет как виджет будет реагировать на "запрос желаемого размера" полученого от внешнего QLayout. В своем примере, определи SizePolicy не для главного виджета, а для кнопок и сразу увидишь эффект.

ErVКак я понимаю, SetGeometry и SetMaximumSize лучше не трогать, так как
Виджет (как я понимаю) перестанет себя адаптировать к изменениям размеров
шрифтов и т.д, а sizeHint (вроде бы) должен определяться Layout'ом
автоматически...Наоборот. Как раз SetMaximumSize и надо трогать если хочешь ограничить виджет в размерах. Естественно он уже не будет расти выше заданого, даже если ты поставишь внутри гигантский шрифт, но ведь ты сам хочешь ограничить максимальный размер, не так ли?
А SetGeometry всего-лишь изменит местонахождение и размер виджета "здесь и сейчас".
...
Рейтинг: 0 / 0
24.05.2007, 17:45
    #34549375
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Qt4.2.2 - запретить виджету/окну растягиваться.
manIf there is a QLayout that manages this widget's children, the size policy specified by that layout is used.оно?
...
Рейтинг: 0 / 0
24.05.2007, 21:45
    #34549819
ErV
ErV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Qt4.2.2 - запретить виджету/окну растягиваться.
White Owl
В своем примере, определи SizePolicy не для главного виджета, а для кнопок и
сразу увидишь эффект.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
TestWidget::TestWidget(QWidget *parent)
:QWidget(parent){
        QPushButton *button1 = new QPushButton();
        QPushButton *button2 = new QPushButton();
        button1->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed);
        button2->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed);
        button1->setText("button1");
        button2->setText("button2");
        QVBoxLayout *layout = new QVBoxLayout();
        layout->addWidget(button1);
        layout->addWidget(button2);
        setLayout(layout);
        setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed);
}
Виджет все равно можно растягивать. хотя кнопки свой размер регулируют.
Кстати, в оригинальном примере перепутал параметры (1й и 2й), но все равно
не работает. Мне просто нужно было запретить ресайз по вертикали и
разрешить по горизонтали.

e White Owl
Как раз SetMaximumSize и надо трогать если хочешь ограничить виджет в
размерах.
[/quote]
Я не хочу ограничить его в размерах, но хочу, чтобы он не растягивался по
вертикали (не всегда одно и то же). Т.е. если юзер вдруг поставит 40й
шрифт, желательно, чтобы виджет к этому адаптировался. Хотя можно взять
sizehint и скопировать его в SizeConstraint :-\ - на изменение системных
шрифтов в процессе работы приложение, вроде бы, не может
отреагировать (по крайней мере, у меня реагирует только на изменение шрифта
для заголовка окна, если это не КДЕ-шное приложение)...

[quot maXmo]
оно?

Почти. У QLayout нету sizePolicy, но есть SizeConstraint, который может
запретить ресайзить виджет
Код: plaintext
1.
layout->setSizeConstraint(QLayout::SetFixedSize);
Только в этом случае запрет идет на весь ресайз виджета - и горизонтальный,
и вертикальный.

В принципе, если других вариантов нету (кроме setSizeConstraint и
setMaximumSize), то проблему можно считать решенной..


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
24.05.2007, 22:40
    #34549898
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Qt4.2.2 - запретить виджету/окну растягиваться.
ErVМне просто нужно было запретить ресайз по вертикали и разрешить по горизонтали.А ты поставь по горизонтали очень большое число и все. Например 65536 и с точки зрения юзера получится безлимитное по горизонтали, но лимитированое по вертикали окно. Просто и легко :) Ну конечно если юзер сумеет найти ТАКОЙ БОЛЬШОЙ дисплей, то он сумеет найти и ограничение по горизонтали, но я не думаю что это случится очень скоро :)
...
Рейтинг: 0 / 0
24.05.2007, 22:42
    #34549903
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Qt4.2.2 - запретить виджету/окну растягиваться.
А если сделать вот так:
Код: plaintext
1.
		setMinimumSize( 200 ,  200 );
		setMaximumSize( 65536 ,  200 );
То получится окно растягивающееся по горизонтали, и фиксированое по вертикали.
...
Рейтинг: 0 / 0
25.05.2007, 00:11
    #34549983
ErV
ErV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Qt4.2.2 - запретить виджету/окну растягиваться.
White Owl wrote:

> А ты поставь по горизонтали очень большое число и все. Например 65536 и с
> точки зрения юзера получится безлимитное по горизонтали, но лимитированое
> по вертикали окно. Просто и легко :) Ну конечно если юзер сумеет найти
> ТАКОЙ БОЛЬШОЙ дисплей, то он сумеет найти и ограничение по горизонтали, но
> я не думаю что это случится очень скоро :)
>
В общем, решил я схитрить и сделать немного по-другому:
Код: plaintext
1.
2.
3.
4.
5.
TestWidget::TestWidget(QWidget *parent)
:QWidget(parent){
        ....
        setMaximumHeight(sizeHint().height());
}
Как понимаю, в этом варианте и размер шрифтов будет учитываться (все равно
после запуска программа их изменения игнорирует), и слишком сильно
растягивать окно не получиться. Спасибо за помощь, вопрос закрыт.

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Qt4.2.2 - запретить виджету/окну растягиваться. / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]