核心思想
第一步:在 Qt Designer 中,假如您已经定义了一个从 QWidget 派生的小部件 Indicator,那么您可以在此处定义它,然后只需在您的 ui 中插入一个 QWidget 作为占位符并将其提升到 Indicator。
第二步:将 UI 文件转换为 UI_StatusBox.py pyuic5.exe -o .\UI_StatusBox.py .\UI_StatusBox.ui
第三步:在主 python 文件中正常加载 Indicator 类,并将其赋值给类变量,这样
实践
第一步:绘制UI文件,占位
第二步:将 UI 文件转换为 UI_StatusBox.
通过指令pyuic5.exe -o .\UI_StatusBox.py .\UI_StatusBox.ui
将上一步的UI文件转换为python代码,形如
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Form(object): def setupUi(self, Form): Form.setObjectName("Form") Form.resize(400, 480) Form.setMinimumSize(QtCore.QSize(400, 480)) Form.setMaximumSize(QtCore.QSize(400, 480)) Form.setStyleSheet("") self.verticalLayout_2 = QtWidgets.QVBoxLayout(Form) self.verticalLayout_2.setObjectName("verticalLayout_2") self.groupBox_2 = QtWidgets.QGroupBox(Form) self.groupBox_2.setMinimumSize(QtCore.QSize(300, 240)) self.groupBox_2.setMaximumSize(QtCore.QSize(400, 240)) self.groupBox_2.setAlignment(QtCore.Qt.AlignCenter) self.groupBox_2.setFlat(True)
self.widget_3 = Indicator(self.widget) self.widget_3.setMinimumSize(QtCore.QSize(30, 30)) self.widget_3.setMaximumSize(QtCore.QSize(30, 30)) self.widget_3.setObjectName("widget_3")
|
可以看到 Indicator 类已经引入,后面就可以正常在python中进行控件的绘制和加载了。
第三步:在主 python 文件中正常加载 Indicator.py 和主 python文件。
Indicator.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| from PyQt5.QtGui import QPainter, QColor from PyQt5.QtWidgets import QWidget
class Indicator(QWidget): def __init__(self,parent=None): super().__init__(parent) self.color = QColor(255, 0, 0) # self.initUI()
def initUI(self): self.setGeometry(100, 100, 100, 100) self.setWindowTitle('Status Indicator')
def paintEvent(self, event): qp = QPainter() qp.begin(self) self.drawIndicator(qp) qp.end()
def drawIndicator(self, qp): qp.setBrush(self.color) qp.drawEllipse(10, 10, 15,15) #x,y,w,h
def setColor(self, color): self.color = color self.update()
|
效果
参考链接
[1] how-do-i-use-promote-to-in-qt-designer-in-pyqt4
[2] PyQt5 在 qtdesigner 中使用自定义的控件
[3] Designing Custom Controls with PyQt