Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Alchazar от Январь 12, 2010, 10:46



Название: GridLayout, как максимально растянуть виджет?
Отправлено: Alchazar от Январь 12, 2010, 10:46
Есть GridLayout с 3-мя столбиками. 1 и 2 имеют фиксированную ширину, а третий должен растягиваться (или я ошибаюсь?) когда меняется размер окна, но он не растягивается. Виджет в третем столбике всегда минимальный.

QGridLayout
Код
C++ (Qt)
   QGridLayout *gridLayout;
   gridLayout = new QGridLayout();
 
   gridLayout->setMargin(4);
   gridLayout->setSpacing(2);
   gridLayout->setColumnMinimumWidth(0, 60);
   gridLayout->setColumnMinimumWidth(1, 45);
   gridLayout->setColumnStretch(0, 0);
   gridLayout->setColumnStretch(1, 1);
   gridLayout->setColumnStretch(2, 2);
 
   gridLayout->addWidget(lbl_CurrentText = new QLabel(CurrentText), 0, 0, Qt::AlignLeft);
   gridLayout->addWidget(lbl_CurrentVal = new QLabel(CurrentVal), 0, 1, Qt::AlignLeft);
 
   gridLayout->addWidget(lbl_WorstText = new QLabel(WorstText), 1, 0, Qt::AlignLeft);
   gridLayout->addWidget(lbl_WorstVal = new QLabel(WorstVal), 1, 1, Qt::AlignLeft);
 
   gridLayout->addWidget(lbl_TrshText = new QLabel(TrshText), 2, 0, Qt::AlignLeft);
   gridLayout->addWidget(lbl_TrshVal = new QLabel(TrshVal), 2, 1, Qt::AlignLeft);
 
   gridLayout->addWidget(lbl_Leg1Text = new QLabel(Leg1Text), 3, 0, Qt::AlignLeft);
   gridLayout->addWidget(lbl_Leg1Val = new QLabel(Leg1Val), 3, 1, Qt::AlignLeft);
 
   gridLayout->addWidget(lbl_Leg2Text = new QLabel(Leg2Text), 4, 0, Qt::AlignLeft);
   gridLayout->addWidget(lbl_Leg2Val = new QLabel(Leg2Val), 4, 1, Qt::AlignLeft);
 
   gridLayout->addWidget(plot_data = new QwtPlot(), 0, 2, 5, 1, Qt::AlignLeft);
 
   curve_line1 = new QwtPlotCurve;
   curve_backg1 = new QwtPlotCurve;
 
   m_line = new QwtPlotMarker;
 
   setLayout(gridLayout);

Третий виджет, который должен бы растянуться
Код
C++ (Qt)
void setPlot(const double &plotMin, const double &plotMax,  const double &plotStep)
       {
           QFont plotFont("Times", 8, QFont::Light);
           plot_data->setCanvasLineWidth(0);
           plot_data->setAxisScale(0, plotMin, plotMax, plotStep);
           plot_data->setAxisFont(0, plotFont);
           plot_data->setMinimumSize(195, 100);
           plot_data->setMaximumSize(16000, 300);
           plot_data->enableAxis(2,false);
           plot_data->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
       }
(http://img34.imageshack.us/img34/4862/gridlayout.jpg)


Название: Re: GridLayout, как максимально растянуть виджет?
Отправлено: Marat(Qt) от Январь 12, 2010, 16:14
Очень вероятно что проблема здесь:
Код:
plot_data->enableAxis(2,false);
Как ее решить - проблема qwt, в котором я не разбираюсь, в любом случае, попробуйте закомментировать эту строку и посмотреть что получится.


Название: Re: GridLayout, как максимально растянуть виджет?
Отправлено: Alchazar от Январь 12, 2010, 16:20
Код:
plot_data->enableAxis(2,false);
тут не при чём, попробовал закоментировать, ничего не изменилось.
Если график помещать в QVBoxLayout он принимает максимальные размеры. Может QGridLayout не растягивает помещёные в него виджеты как QVBoxLayout?


Название: Re: GridLayout, как максимально растянуть виджет?
Отправлено: pastor от Январь 12, 2010, 16:23
Замени

Код
C++ (Qt)
gridLayout->setColumnStretch(0, 0);
gridLayout->setColumnStretch(1, 1);
gridLayout->setColumnStretch(2, 2);

на

Код
C++ (Qt)
gridLayout->setColumnStretch(2, 1);


Название: Re: GridLayout, как максимально растянуть виджет?
Отправлено: Marat(Qt) от Январь 12, 2010, 16:26
Блин, я так понимаю, пустое пространство слева от QwtPlot - это выросшая вторая колонка? А чем объяснить пробел справа?


Название: Re: GridLayout, как максимально растянуть виджет?
Отправлено: Alchazar от Январь 12, 2010, 17:51
Код:
gridLayout->setColumnStretch(2, 1);
не помогает.
Я думаю, что размер колонок нормальный, только сам график не хочет вытягиваться.


Название: Re: GridLayout, как максимально растянуть виджет?
Отправлено: Alchazar от Январь 12, 2010, 17:58
Попробовал вставить QLineEdit вместо графика, результат тот же.
Что-то где-то я не замечаю.


Название: Re: GridLayout, как максимально растянуть виджет?
Отправлено: BRE от Январь 12, 2010, 18:01
Набросал пример:


Название: Re: GridLayout, как максимально растянуть виджет?
Отправлено: Marat(Qt) от Январь 12, 2010, 20:59
Я так тоже делал, причем вместо QFrame у меня QwtPlot был и все работало в preview как положено.


Название: Re: GridLayout, как максимально растянуть виджет?
Отправлено: Alchazar от Январь 13, 2010, 15:08
Посмотрел пример, попробовал вставить QwtPlot вместо QFrame, в дизайнере всё работает.
Переделал свою форму (положил в GroupBox VerticalLayout и уже в него засунул gridLayout), но ничего не изменилось. Пробовал ложить VerticalLayout в gridLayout вместо QwtPlot, а QwtPlot ложил в VerticalLayout, но всё равно результат тот же, только график рисовался с правого края не смотря на то, что Qt::AlignLeft.


Название: Re: GridLayout, как максимально растянуть виджет?
Отправлено: Alchazar от Январь 13, 2010, 15:55
Сделал немного по другому:
все QLabel положил в GridLayout, а потом GridLayout и QwtPlot положил в HorizontalLayout.
Теперь всё растягивается как следует)


Название: Re: GridLayout, как максимально растянуть виджет?
Отправлено: BRE от Январь 13, 2010, 15:56
Ты на политики виджетов обрати внимание (QSizePolicy).


Название: Re: GridLayout, как максимально растянуть виджет?
Отправлено: Alchazar от Январь 13, 2010, 16:33
Пробовал их менять, ничего не помогло.


Название: Re: GridLayout, как максимально растянуть виджет?
Отправлено: Marat(Qt) от Январь 13, 2010, 18:18
Сделал немного по другому:
все QLabel положил в GridLayout, а потом GridLayout и QwtPlot положил в HorizontalLayout.
Теперь всё растягивается как следует)
Из этого ответа очевидно что вы напортачили со свойствами gridlayout. Для нормальной работы достаточно было трех столбцов, первые два - label'ы, третий - qwtPlot. Все свойства грида оставить такими, какими они были по умолчанию. Так тоже должно работать, по крайней мере я в дизайнере так делал.