0

使用 pyuic5 code.ui -o code.py 将 .ui 文件转换为 .py 时,在 JetBrains PyCharm Community Edition 中运行 .py 文件后,GUI 窗口会从 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_())

ui文件:

<?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 中预览的窗口截图

编辑:添加了 UI 文件

4

1 回答 1

1

虽然 Designer 尝试向您展示您创建的窗口的预览,但无法保证您所看到的正是最终程序中实际出现的内容。

首先,除了明显的操作系统差异外,每个平台都有不同的风格可以使用(你可以从菜单“Form”>“Preview in”中尝试其中的一些)。除此之外,Designer 还会将一些默认(内容)边距和字体大小应用于其取决于各个方面的小部件,并且可能无法反映最终结果,尤其是在使用具有 HiDPI(或任何非默认 DPI 设置)的屏幕时.

也就是说,这里最重要的方面是您为内部布局使用了固定的几何形状,这限制了小部件的可用空间。
由于某种原因(可能是 PyCharm 设置的一些默认环境设置),字体大小DPI 与它们在 Designer 中的不同,并且由于生成的字体大于小部件的可用空间,因此它们的内容被裁剪。

最简单的解决方案是使用固定几何图形,而是为整个窗口应用布局。如果您需要一些边距,您可以从 Designer 添加水平和垂直间距。

请记住,始终不鼓励使用固定的几何形状。即使您的程序看起来像您想要的那样显示,也不能保证它会在其他人的计算机上做同样的事情:最常见的情况是人们更改系统默认字体(家庭和/或大小),这种情况发生的频率比你想象的要多。

最后,为什么adjustSize没有工作?

  1. 你在接口还在创建的时候调用了;那时,它还没有被“抛光”(这意味着还没有根据小部件希望显示的大小检查字体大小和边距等内容)。在 UI 处于该点时这样做几乎是无用的。
  2. 即使您在那之后调用它(通常是在调用 之后的某个时间show()),该函数也只会告诉小部件调整其大小以适应其内容;虽然它理论上意味着它会尝试扩展自己,但它的父级不允许它(固定几何,还记得吗?),无论如何你最终都会得到一个部分可见的小部件。
于 2020-01-21T14:26:27.743 回答