pyuic4 генерирует неправильный макет?

#layout #pyqt #pyqt4 #qt-designer #pyuic

#макет #pyqt #pyqt4 #qt-designer #pyuic

Вопрос:

pyuic4, похоже, генерирует неправильный макет на основе файла .ui из Qt Designer. Файл пользовательского интерфейса находится здесь:

 <?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>Dialog</class>
 <widget class="QDialog" name="Dialog">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>348</width>
    <height>267</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>Dialog</string>
  </property>
  <layout class="QVBoxLayout" name="verticalLayout_2">
   <item>
    <layout class="QVBoxLayout" name="verticalLayout">
     <item alignment="Qt::AlignTop">
      <widget class="QLabel" name="label">
       <property name="sizePolicy">
        <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
         <horstretch>0</horstretch>
         <verstretch>0</verstretch>
        </sizepolicy>
       </property>
       <property name="maximumSize">
        <size>
         <width>16777215</width>
         <height>25</height>
        </size>
       </property>
       <property name="text">
        <string>amp;<htmlamp;>amp;<head/amp;>amp;<bodyamp;>amp;<p align=amp;quot;centeramp;quot;amp;>amp;<span style=amp;quot; font-size:14pt;amp;quot;amp;>Some Textamp;</spanamp;>amp;</pamp;>amp;</bodyamp;>amp;</htmlamp;></string>
       </property>
      </widget>
     </item>
     <item alignment="Qt::AlignTop">
      <widget class="Line" name="line_2">
       <property name="sizePolicy">
        <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
         <horstretch>0</horstretch>
         <verstretch>0</verstretch>
        </sizepolicy>
       </property>
       <property name="orientation">
        <enum>Qt::Horizontal</enum>
       </property>
      </widget>
     </item>
     <item alignment="Qt::AlignBottom">
      <widget class="Line" name="line">
       <property name="orientation">
        <enum>Qt::Horizontal</enum>
       </property>
      </widget>
     </item>
     <item>
      <layout class="QHBoxLayout" name="horizontalLayout">
       <item alignment="Qt::AlignBottom">
        <widget class="QPushButton" name="btn_customize">
         <property name="text">
          <string>Customize</string>
         </property>
        </widget>
       </item>
       <item alignment="Qt::AlignBottom">
        <widget class="QPushButton" name="btn_done">
         <property name="text">
          <string>OK</string>
         </property>
        </widget>
       </item>
      </layout>
     </item>
    </layout>
   </item>
  </layout>
 </widget>
 <resources/>
 <connections/>
</ui>
  

В этом макете я пытаюсь выровнять пару кнопок с нижней частью диалогового окна, а некоторый текст — с верхней. При запуске pyuic4 test.ui --preview все объекты выровнены по центру по горизонтали, а не по верху и низу (и отображение этого диалогового окна из реальной программы python показывает те же результаты). Для сравнения, pyuic5 test.ui --preview кажется, что это больше соответствует тому, что я хотел получить.

Если это поможет, моя версия pyuic4 — 4.11.4, и я использую Ubuntu 16.04.

Есть идеи? Я делаю что-то не так? Или, возможно, существует более новый pyuic4?

Ответ №1:

В pyuic была ошибка, которая повлияла на обработку выравнивания в макетах. Это было исправлено в PyQt-5.5, который был выпущен 17 июля 2015 года. Однако PyQt-4.11.4 (которая является текущей версией) была выпущена 11 июня 2015 года, поэтому исправление еще не включено. Тем не менее, текущий моментальный снимок разработки для PyQt-4.12 включает исправление.

Но я не думаю, что это действительно решит вашу проблему. Что вам нужно сделать вместо этого, так это использовать расширяющиеся прокладки. Вот как это сделать, используя ваш пример файла пользовательского интерфейса:

  1. Щелкните на горизонтальной кнопке layout, а затем нажмите Break Layout (это удалит все текущие макеты).
  2. Ctrl щелкните две кнопки, а затем щелкните Макет по горизонтали.
  3. Щелкните диалоговое окно, а затем щелкните Макет по вертикали.
  4. Перетащите вертикальный разделитель между двумя линейными виджетами

Предоставляя вам это:

скриншот

Если вы хотите разместить какие-то другие виджеты в центральной области, вам может потребоваться добавить расширяющиеся вертикальные разделители над и / или под ними, чтобы получить те же результаты. Опять же, если вы поместите туда что-то вроде текстового поля или виджета списка, оно должно автоматически расшириться, чтобы заполнить доступное пространство — в этом случае не было бы необходимости в каких-либо разделителях (или выравниваниях макета).

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

1. один для информирования об ошибке и объяснения за пределами исходного примера