使用Qt Designer 5.9.5通过QFontComboBox构建简单的ui。当我运行pyuic5时,它会生成错误;
pyuic5 demoFontComboBox.ui -o demoFontComboBox.py
Unknown C++ class: QfontDatabase
.ui文件是;
<?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>500</width>
<height>240</height>
</rect>
</property>
<property name="windowTitle">
<string>Dialog</string>
</property>
<widget class="QLabel" name="label">
<property name="geometry">
<rect>
<x>30</x>
<y>50</y>
<width>81</width>
<height>17</height>
</rect>
</property>
<property name="text">
<string>Select font</string>
</property>
</widget>
<widget class="QLabel" name="label_2">
<property name="geometry">
<rect>
<x>30</x>
<y>90</y>
<width>81</width>
<height>17</height>
</rect>
</property>
<property name="text">
<string>Type text</string>
</property>
</widget>
<widget class="QFontComboBox" name="fontSelect">
<property name="geometry">
<rect>
<x>120</x>
<y>40</y>
<width>291</width>
<height>25</height>
</rect>
</property>
<property name="writingSystem">
<enum>QFontDatabase::Any</enum>
</property>
</widget>
<widget class="QTextEdit" name="textEdit">
<property name="geometry">
<rect>
<x>120</x>
<y>80</y>
<width>291</width>
<height>101</height>
</rect>
</property>
</widget>
</widget>
<resources/>
<connections/>
</ui>
部分.py文件生成如下;
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'demoFontComboBox.ui'
#
# Created by: PyQt5 UI code generator 5.9.2
#
# WARNING! All changes made in this file will be lost!
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Dialog(object):
def setupUi(self, Dialog):
Dialog.setObjectName("Dialog")
Dialog.resize(500, 240)
self.label = QtWidgets.QLabel(Dialog)
self.label.setGeometry(QtCore.QRect(30, 50, 81, 17))
self.label.setObjectName("label")
self.label_2 = QtWidgets.QLabel(Dialog)
self.label_2.setGeometry(QtCore.QRect(30, 90, 81, 17))
self.label_2.setObjectName("label_2")
self.fontSelect = QtWidgets.QFontComboBox(Dialog)
self.fontSelect.setGeometry(QtCore.QRect(120, 40, 291, 25))
生成的代码似乎缺少retranslatedUi()函数声明和调用。
在尝试上述ui示例之前和之后,pyuic5已成功使用QLineEdit,QButton,QRadioButton从ui生成文件。
答案 0 :(得分:1)
似乎这是一个PyQt5错误,无法识别QFontDatabase类,目前的解决方法是消除以下几行:
<property name="writingSystem">
<enum>QFontDatabase::Any</enum>
</property>
因此执行命令:
pyuic5 demoFontComboBox.ui -o demoFontComboBox.py -x
您得到以下信息:
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'demoFontComboBox.ui'
#
# Created by: PyQt5 UI code generator 5.12.1
#
# WARNING! All changes made in this file will be lost!
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Dialog(object):
def setupUi(self, Dialog):
Dialog.setObjectName("Dialog")
Dialog.resize(500, 240)
self.label = QtWidgets.QLabel(Dialog)
self.label.setGeometry(QtCore.QRect(30, 50, 81, 17))
self.label.setObjectName("label")
self.label_2 = QtWidgets.QLabel(Dialog)
self.label_2.setGeometry(QtCore.QRect(30, 90, 81, 17))
self.label_2.setObjectName("label_2")
self.fontSelect = QtWidgets.QFontComboBox(Dialog)
self.fontSelect.setGeometry(QtCore.QRect(120, 40, 291, 25))
self.fontSelect.setObjectName("fontSelect")
self.textEdit = QtWidgets.QTextEdit(Dialog)
self.textEdit.setGeometry(QtCore.QRect(120, 80, 291, 101))
self.textEdit.setObjectName("textEdit")
self.retranslateUi(Dialog)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
_translate = QtCore.QCoreApplication.translate
Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
self.label.setText(_translate("Dialog", "Select font"))
self.label_2.setText(_translate("Dialog", "Type text"))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
Dialog = QtWidgets.QDialog()
ui = Ui_Dialog()
ui.setupUi(Dialog)
Dialog.show()
sys.exit(app.exec_())
仍在为pyqt5制作补丁。
解决方案是在PyQt5 / uic / Compiler / qtproxies.py中注册QFontDatabase类:
# ...
class QtGui(ProxyNamespace):
class QIcon(ProxyClass):
class fromTheme(ProxyClass): pass
class QConicalGradient(ProxyClass): pass
class QLinearGradient(ProxyClass): pass
class QRadialGradient(ProxyClass): pass
class QBrush(ProxyClass): pass
class QPainter(ProxyClass): pass
class QPalette(ProxyClass): pass
class QFont(ProxyClass): pass
class QFontDatabase(ProxyClass): pass # <--- add this line
# ...