LINUX.ORG.RU

[qt4][layouts]Туплю

 


0

0

Привет всем. В общем сильно туплю на ровном месте и прошу помощи:

Есть окно, в нем должно быть 2 виджета (левый и правый), которые разделены при помощи QSplitter. Надо чтобы независимо от размера окна левый имел размер допустим 100 пикселей, а правый - остальное, причем splitter позволял увеличивать размер левого, но не уменьшать.

Что-то я совсем запутался в этом всем. Гугл и книги как-то не прояснили.

★★★★★

Можно попробовать ловить изменение сплиттера (наверное так:
void splitterMoved ( int pos, int index )
) и устанавливать на левый виджет minimumSize.

Но со сплиттерами игрался последний раз очень давно и осознал их ненужность. Так что могу ошибаться. Сам предпочитаю доквиджеты.

staseg ★★★★★
()
Ответ на: комментарий от dmitry_vk

Хочу обойтись работой в Designer - т.е. эта задача же должна решаться без написания кода!?
Минимальную ширину задавал - работает. А StretchFactor - какой его задавать? 0 для левой и 1 для правой не дают должного эффекта. Мне же надо, чтобы левая вышла на минимальную длину.

Pavval ★★★★★
() автор топика
Ответ на: комментарий от Pavval

>эта задача же должна решаться без написания кода!?

Это как, без написания кода? =)

>StretchFactor - какой его задавать?

Он тут не нужен, нужно, как тебе уже посоветовали, что-то вроде этого:

class Splitter : public QSplitter {
	Q_OBJECT
public:
	Splitter( QWidget* p = 0 ) : QSplitter( Qt::Horizontal, p ) {
		setChildrenCollapsible( false );
		connect( this, SIGNAL(splitterMoved( int , int )), this, SLOT(setMin()) );
	}

private slots:
	void setMin() {
		if( widget( 0 ) ) {
			widget( 0 )->setMinimumWidth( widget( 0 )->width() );
		}
	}
};

summatus
()

Все сильно проще, чем выше пишут, на самом деле но без написания кода не получится, сейчас будет понятно почему:

splitter->setCollapsible(0, false);
QList<int> sizes;
sizes << 100 << 300;
splitter->setSizes(sizes);
splitter->setStretchFactor(splitter->indexOf(textEdit), 0);
splitter->setStretchFactor(splitter->indexOf(textEdit_2), 1);

Еще бы не плохо задать минимальный размер первому виджету, теже самые 100 пикселей. Как-то так.

SLiDER
()
Ответ на: комментарий от summatus

> Этот код не помешает уменьшать левый виджет.

Эмммм, я же написал

> Еще бы не плохо задать минимальный размер первому виджету, теже самые 100 пикселей

SLiDER
()
Ответ на: комментарий от SLiDER

>Эмммм, я же написал

Я читать умею. Топикстартеру, как он пишет, нужен полный запрет на уменьшение левого вижета, должно быть разрешено только увеличение, а ты предлагаешь просто выставить ему минимальный размер.

summatus
()
Ответ на: комментарий от summatus

Мне нужно, чтобы размер не уменьшался ниже X, а не чтобы не уменьшался вообще. Т.е. изначальный размер = X, он же минимальный. А выставлять можно любой >= X.

Pavval ★★★★★
() автор топика
Ответ на: комментарий от SLiDER

Спасибо, прояснило.
Итак, изначальный код, который заработал так, как надо:

QList<int> sizes;
sizes << ui->widget->minimumWidth() << 0;
ui->splitter->setSizes(sizes);
ui->splitter->setStretchFactor(ui->splitter->indexOf(ui->widget), 0);
ui->splitter->setStretchFactor(ui->splitter->indexOf(ui->widget_2), 1);

При этом я minimumWidth задал в Designer (напомню, что моей задачей изначально является перенести максимум всего из кода в ui файл (т.е. чтобы задавать поведение по возможности в Designer) ).

Далее я вместо последних двух строк я задал в Designer widget_2->sizePolicy->horizontalStretch = 1 (при этом у ui->widget оно остается = 0 по умолчанию).

В общем, то, что я не смог задать через Designer - это начальный размер:

QList<int> sizes;
sizes << ui->widget->minimumWidth() << 0;
ui->splitter->setSizes(sizes);

Спасибо всем!

Pavval ★★★★★
() автор топика
Ответ на: комментарий от summatus

>>причем splitter позволял увеличивать размер левого, но не уменьшать.

>Твои слова.

Сори за неоднозначность. Т.е. нельзя уменьшать ниже минимума. Только увеличивать - это бред с точки зрения здравого смысла.

Pavval ★★★★★
() автор топика
Ответ на: комментарий от Pavval

>Сори за неоднозначность

Хм... Если все так просто, неужели не помогает простое выставление minimumWidth левого виджета в самом дизайнере?

staseg ★★★★★
()
Ответ на: комментарий от staseg

>Хм... Если все так просто, неужели не помогает простое выставление minimumWidth левого виджета в самом дизайнере?

Неа. Наверное дело в том, что виджеты, которые внутри левого widget, выставляют свои претензии относительно дефолтного размера.

Pavval ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.