Проблема форматирования при преобразовании файла .ui в файл .py в Windows

При преобразовании файла .ui в .py с помощью: pyuic5 code.ui -o code.py. После запуска файла .py в JetBrains PyCharm Community Edition окно графического интерфейса изменяется по сравнению с тем, что было предварительно просмотрено в Qt Designer, и обрезает текст кнопку, как показано на прикрепленных изображениях.

Я включил: self.pushButton.adjustSize() в строку 41, но это не помогает.

Я прикрепил преобразованный код и скриншоты проблемы. В настоящее время я использую Windows 10.

Кто-нибудь знает, как этого избежать?

py-файл:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file '.\Designer_ui_code.ui'
#
# Created by: PyQt5 UI code generator 5.9
#
# WARNING! All changes made in this file will be lost!

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(263, 171)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.layoutWidget = QtWidgets.QWidget(self.centralwidget)
        self.layoutWidget.setGeometry(QtCore.QRect(90, 30, 77, 44))
        self.layoutWidget.setObjectName("layoutWidget")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.layoutWidget)
        self.verticalLayout.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout.setObjectName("verticalLayout")
        self.label = QtWidgets.QLabel(self.layoutWidget)
        self.label.setAlignment(QtCore.Qt.AlignCenter)
        self.label.setObjectName("label")
        self.verticalLayout.addWidget(self.label)
        self.pushButton = QtWidgets.QPushButton(self.layoutWidget)
        self.pushButton.setObjectName("pushButton")
        self.verticalLayout.addWidget(self.pushButton)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 263, 21))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        self.pushButton.clicked.connect(self.label.clear)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

        self.pushButton.adjustSize()

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.label.setText(_translate("MainWindow", "A Label"))
        self.pushButton.setText(_translate("MainWindow", "PushButton"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

Файл пользовательского интерфейса:

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>412</width>
    <height>213</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <widget class="QWidget" name="layoutWidget">
    <property name="geometry">
     <rect>
      <x>150</x>
      <y>50</y>
      <width>77</width>
      <height>44</height>
     </rect>
    </property>
    <layout class="QVBoxLayout" name="verticalLayout">
     <item>
      <widget class="QLabel" name="label">
       <property name="text">
        <string>TextLabel</string>
       </property>
      </widget>
     </item>
     <item>
      <widget class="QPushButton" name="pushButton">
       <property name="sizePolicy">
        <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
         <horstretch>1</horstretch>
         <verstretch>1</verstretch>
        </sizepolicy>
       </property>
       <property name="text">
        <string>PushButton</string>
       </property>
      </widget>
     </item>
    </layout>
   </widget>
  </widget>
  <widget class="QMenuBar" name="menubar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>412</width>
     <height>18</height>
    </rect>
   </property>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <resources/>
 <connections>
  <connection>
   <sender>pushButton</sender>
   <signal>clicked()</signal>
   <receiver>label</receiver>
   <slot>clear()</slot>
   <hints>
    <hint type="sourcelabel">
     <x>181</x>
     <y>103</y>
    </hint>
    <hint type="destinationlabel">
     <x>181</x>
     <y>77</y>
    </hint>
   </hints>
  </connection>
 </connections>
</ui>

Изображение окна запускалось как файл .py

Скриншот окна, предварительно просмотренного в Qt Designer

Изменить: добавлен файл пользовательского интерфейса


person JKEL    schedule 21.01.2020    source источник
comment
Пожалуйста, опубликуйте файл .ui   -  person S. Nick    schedule 21.01.2020


Ответы (1)


Хотя Designer пытается показать вам предварительный просмотр созданных вами окон, нет гарантии, что вы увидите точно то, что на самом деле появится в окончательной программе.

Во-первых, помимо очевидных различий между ОС, каждая платформа имеет разные стили, которые можно использовать (вы можете попробовать некоторые из них в меню «Форма» > «Просмотр в»). Помимо этого, Designer также применяет к своему виджету некоторые поля и размеры шрифта по умолчанию (контента), которые зависят от различных аспектов и могут не отражать окончательный результат, особенно при использовании экранов с HiDPI (или любой конкретной настройкой DPI, которая не является значением по умолчанию) .

Тем не менее, наиболее важным аспектом здесь является то, что вы используете фиксированную геометрию для внутреннего макета, что ограничивает доступное пространство для виджетов.
По какой-то причине (возможно, некоторые настройки среды по умолчанию, установленные PyCharm), шрифт size или DPI отличаются от тех, что были в Designer, и, поскольку результирующий шрифт больше, чем доступное пространство для виджетов, их содержимое обрезается.

Самое простое решение — не использовать фиксированную геометрию, а применить макет ко всему окну. Если вам нужны поля, вы можете добавить горизонтальные и вертикальные интервалы из Designer.

Имейте в виду, что использование фиксированной геометрии всегда не рекомендуется. Даже если вы дойдете до того, что ваша программа будет отображаться так, как вы хотели, нет никакой гарантии, что она будет делать то же самое на чужом компьютере: наиболее распространенный случай — когда люди меняют системный шрифт по умолчанию (семейство и/или размер ), что происходит чаще, чем вы думаете.

Наконец, почему adjustSize не сработало?

  1. Вы позвонили, когда интерфейс еще создавался; на тот момент он еще не был «отшлифован» (это означает, что такие вещи, как размеры шрифта и поля, не сравнивались с размером, который виджет предпочел бы отображать). Делать это, когда пользовательский интерфейс находится в этой точке, почти бесполезно.
  2. Даже если вы вызовете ее после этого (обычно через некоторое время после вызова show()), эта функция только прикажет виджету отрегулировать свой размер, чтобы он соответствовал его содержимому; хотя теоретически это означает, что он попытается расшириться, его родитель не позволит этого (фиксированная геометрия, помните?), и вы все равно получите частично видимый виджет.
person musicamante    schedule 21.01.2020