Как «прикрепить» виджеты к нижней части расширяющегося окна?

#c #qt #qt4 #qt-creator

#c #qt #qt4 #qt-creator

Вопрос:

У меня есть куча стандартных элементов управления qt Creator, которые я размещаю в нижней части окна. У меня есть один табличный виджет, который я хочу развернуть вертикально, чтобы иметь возможность отображать больше строк, если окно расширено вниз, меньше, если вверх, до минимума. Я хочу, чтобы все остальные виджеты прилипали к нижней части окна по мере перемещения этого края. Я использую Qt Creator 2.1.0 и Qt 4.7, и я не вижу никаких флагов для виджетов, которые делали бы то, что мне нужно, и поиск в Google действительно не дал ничего полезного. Возможно, это как-то связано с помещением виджетов в контейнер, который перемещается и / или растягивается? Прямо сейчас они находятся только в MainWindow.

Комментарии:

1. Этот вопрос был бы лучше, если бы вы указали, используете ли вы какие-либо макеты: ответы будут сильно отличаться в зависимости от этого.

Ответ №1:

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

Комментарии:

1. Я изучу это. Сначала нужно создать резервную копию. 🙂

2. @fyngyrz Ах, ты не используешь контроль версий? Вы должны. Это тривиально, для этого не нужен центральный репозиторий, просто git init тогда git add -A и, наконец git commit -m "Initial commit" . И с этого момента все идет гладко. Я предлагаю графический клиент, такой как smartgit, который стоит каждого пенни, но, конечно, не является абсолютно необходимым.

3. @ddriver вы были ближе всех, поэтому у вас есть галочка. Вот что вам нужно сделать. Создайте свой макет (что я и сделал), а затем, вуду: вы щелкаете по окну так, чтобы выбрать его, а не свой макет, затем выберите «выложить в виде сетки» из контекстного меню. Это (каким-то образом) захватывает ваш макет ниже по потоку без необходимости что-либо делать, прикрепляется к окну выше по потоку, и все остальное растягивается. Надеюсь, это поможет кому-то еще, кто пытается преодолеть дизайнерское вуду.

4. @kuba-ober да, я пользователь git. Однако это еще даже не было призраком приложения, поскольку я не мог заставить форму воспроизводиться правильно. Теперь я буду писать некоторый код, и в нем будет задействован git. Но спасибо. В точку.

5. Что такое разделитель? Я не вижу ничего, что называется spacer в окне виджета?

Ответ №2:

QMainWindow следует использовать только в том случае, если вам нужна его функциональность закрепления. В противном случае просто используйте обычный QWidget . Никакие дочерние виджеты общего назначения не могут быть «прикреплены» к QMainWindow . Они должны принадлежать центральному виджету. Все, что вам, скорее всего, нужно сделать, это установить Expanding политику вертикального размера для табличного виджета. Дизайнер должен делать это по умолчанию. Вот пример:

mainwindow.ui

 <?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <widget class="QWidget" name="centralwidget">
   <layout class="QVBoxLayout" name="verticalLayout">
    <item>
     <widget class="QTableWidget" name="table">
      <row>
       <property name="text">
        <string>1</string>
       </property>
      </row>
      <column>
       <property name="text">
        <string>Name</string>
       </property>
      </column>
      <item row="0" column="0">
       <property name="text">
        <string>fyngyrz</string>
       </property>
      </item>
     </widget>
    </item>
    <item>
     <layout class="QHBoxLayout" name="horizontalLayout">
      <item>
       <widget class="QPushButton" name="foo">
        <property name="text">
         <string>Foo</string>
        </property>
       </widget>
      </item>
      <item>
       <widget class="QPushButton" name="bar">
        <property name="text">
         <string>Bar</string>
        </property>
       </widget>
      </item>
     </layout>
    </item>
   </layout>
  </widget>
 </widget>
 <resources/>
 <connections/>
</ui>
  

Комментарии:

1. Похоже, это не соответствует моим обстоятельствам. Таблица настроена на расширение. Но это не так. Возможно, это должно быть внутри чего-то другого. В любом случае единственное, что меняется, — это размер угла окна и его краев.

2. Тогда @fyngyrz опубликуйте свернутый файл .ui в вашем вопросе. Или сравните тот, который у вас есть, с тем, который я опубликовал: они представляют собой довольно простой XML, он должен быть понятен сам по себе. Мне кажется, что в вашем дизайне нет никаких макетов.

3. Макет находится в конструкторе. Итак, что я получаю, это mainwindow с центральным виджетом, в который я могу поместить… ну, неважно. Это имеет благотворный эффект, позволяя точно позиционировать виджет и изменять его размеры без какого-либо вмешательства со стороны Qt, поэтому я надеялся использовать его в том виде, в каком он есть. С этим мне пока что не повезло — похоже, все приходится переносить в различные сетки Qt типа «Я определю размер для вас» и так далее, что в значительной степени нарушает то, что я пытался сделать. Единственное, что не сработало, это то, что различные виджеты внизу прилипли к краю окна. Создаем подкласс и перемещаем … meh

4. Вы можете установить для любого виджета, который вы хотите, фиксированный размер, и вы можете установить макет с нулевыми полями и нулевым интервалом. Скорее всего, это должно выполнить 99% того, что вы хотите. В противном случае вам придется самостоятельно управлять геометрией дочернего виджета, точно так же, как если бы вы писали собственный код WIN32. Переопределите родительские resizeEvent и вуаля. Полагаю, я восхищаюсь вашей настойчивостью, если вы внедрили sdrdx без единого макета, но, возможно, в этом не было всей необходимости. Политики размера виджетов имеют значение только для макетов (или вашего собственного кода), в противном случае они бесполезны.

5. Qt Designer — это способ графической генерации кода, создающего экземпляр виджета ( foo.ui file -> uic -> ui_foo.h ). Вы можете использовать Designer, чтобы придумать практически все, что вы могли бы написать вручную, что не требует итерации для создания виджетов. Вам вообще не нужно использовать Designer. Большая часть кода, который вам пришлось бы написать, тривиальна, смотрите почти все здесь: github.com/KubaO/stackoverflown/tree/master/questions

Ответ №3:

Из вашего вопроса трудно понять, что вы пытаетесь сделать, но, возможно, вы ищете QSplitter.

В качестве альтернативы вы можете указать различные QLayout для QWidget, такие как QHBoxLayout, QVBoxLayout, QGridLayout и т.д. В указанный вами макет можно добавлять различные виджеты, затем вы устанавливаете макет в QWidget, чтобы он действовал как контейнер для виджетов, которые вы добавили в макет. Флаги растяжения и выравнивания можно устанавливать при добавлении виджетов в макет.

Комментарии:

1. Спасибо. Я посмотрю, что я смогу выяснить, оцените указатель.