在 windows 中从 .ui 文件转换为 .py 文件时出现格式问题
Formatting issue when converting from .ui file to .py file in windows
使用以下方法将 .ui 文件转换为 .py 时:pyuic5 code.ui -o code.py,在 运行 .py 文件上在 JetBrains PyCharm Community Edition 中,GUI window 与 Qt Designer 中的预览有所不同,并剪掉了按钮的文本,如附图所示。
我在第 41 行包括了:self.pushButton.adjustSize()
,但它似乎没有帮助。
我附上问题的转换代码和屏幕截图。我现在 运行 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>
window 运行 的图片作为 .py 文件
在 Qt Designer 中预览的 window 的屏幕截图
编辑:添加了 UI 文件
虽然 Designer 会尝试向您展示您创建的 windows 的预览,但不能保证您将看到的完全最终计划。
首先,除了明显的OS差异外,每个平台都有不同的样式可以使用(您可以从菜单"Form">"Preview in"中尝试其中的一些)。除此之外,Designer 还会将一些默认(内容)边距和字体大小应用于其取决于各个方面的小部件,并且可能不会反映最终结果,尤其是在使用具有 HiDPI(或任何非默认的特定 DPI 设置)的屏幕时.
也就是说,这里最重要的方面是您为内部布局使用了固定的几何图形,这限制了小部件的可用 space。
由于某些原因(可能是 PyCharm 设置的一些默认环境设置),字体大小 或 DPI 与它们在 Designer 中的不同,并且由于生成的字体是大于可用的 space 小部件,它们的内容被裁剪。
最简单的解决方案是不使用固定的几何图形,而是为整个window应用布局。如果您需要一些边距,可以从 Designer 添加水平和垂直间距。
请记住,始终不鼓励使用固定几何图形。即使你的程序看起来像你想要的那样显示,也不能保证它会在其他人的计算机上做同样的事情:最常见的情况是人们更改系统默认字体(family and/or 尺寸),这种情况比你想象的更频繁。
最后,为什么adjustSize
没用?
- 您在接口还在创建的时候调用了;到那时,它还没有 "polished" (这意味着诸如字体大小和边距之类的东西还没有根据小部件希望显示的大小进行检查)。在 UI 处于那个点时这样做几乎是无用的。
- 即使您在那之后调用它(通常是在调用
show()
之后的某个时间),该函数也只会告诉小部件调整其大小以适合其内容;虽然它理论上意味着它会尝试扩展自己,但它的父级不允许它(固定的几何形状,还记得吗?),无论如何你最终都会得到一个部分可见的小部件。
使用以下方法将 .ui 文件转换为 .py 时:pyuic5 code.ui -o code.py,在 运行 .py 文件上在 JetBrains PyCharm Community Edition 中,GUI window 与 Qt Designer 中的预览有所不同,并剪掉了按钮的文本,如附图所示。
我在第 41 行包括了:self.pushButton.adjustSize()
,但它似乎没有帮助。
我附上问题的转换代码和屏幕截图。我现在 运行 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>
window 运行 的图片作为 .py 文件
在 Qt Designer 中预览的 window 的屏幕截图
编辑:添加了 UI 文件
虽然 Designer 会尝试向您展示您创建的 windows 的预览,但不能保证您将看到的完全最终计划。
首先,除了明显的OS差异外,每个平台都有不同的样式可以使用(您可以从菜单"Form">"Preview in"中尝试其中的一些)。除此之外,Designer 还会将一些默认(内容)边距和字体大小应用于其取决于各个方面的小部件,并且可能不会反映最终结果,尤其是在使用具有 HiDPI(或任何非默认的特定 DPI 设置)的屏幕时.
也就是说,这里最重要的方面是您为内部布局使用了固定的几何图形,这限制了小部件的可用 space。
由于某些原因(可能是 PyCharm 设置的一些默认环境设置),字体大小 或 DPI 与它们在 Designer 中的不同,并且由于生成的字体是大于可用的 space 小部件,它们的内容被裁剪。
最简单的解决方案是不使用固定的几何图形,而是为整个window应用布局。如果您需要一些边距,可以从 Designer 添加水平和垂直间距。
请记住,始终不鼓励使用固定几何图形。即使你的程序看起来像你想要的那样显示,也不能保证它会在其他人的计算机上做同样的事情:最常见的情况是人们更改系统默认字体(family and/or 尺寸),这种情况比你想象的更频繁。
最后,为什么adjustSize
没用?
- 您在接口还在创建的时候调用了;到那时,它还没有 "polished" (这意味着诸如字体大小和边距之类的东西还没有根据小部件希望显示的大小进行检查)。在 UI 处于那个点时这样做几乎是无用的。
- 即使您在那之后调用它(通常是在调用
show()
之后的某个时间),该函数也只会告诉小部件调整其大小以适合其内容;虽然它理论上意味着它会尝试扩展自己,但它的父级不允许它(固定的几何形状,还记得吗?),无论如何你最终都会得到一个部分可见的小部件。