Как нарисовать прямоугольник в PyQt?

Рейтинг: 0Ответов: 1Опубликовано: 27.07.2023

Я создал простое окно в Qt Designer, конвертировал его через pyuic5 в файл.py и хочу на нём нарисовать прямоугольник.

Ниже код. Везде написано про paintEvent, но я не нашёл ничего про использование paintEvent в конвертированном файле.

Что надо добавить, чтобы этот код заработал?

main.py:

from PyQt5 import QtCore, QtWidgets
from PyQt5.QtGui import QPainter, QColor


class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(400, 400)
        self.label = QtWidgets.QLabel(Form)
        self.label.setGeometry(QtCore.QRect(160, 10, 47, 13))
        self.label.setObjectName("label")

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "Form"))
        self.label.setText(_translate("Form", "TextLabel"))

    def paintEvent(self, e):
        print("Ok")
        painter = QPainter()
        painter.setPen(QColor(255, 0, 0))
        painter.drawRect(50, 50, 100, 100)


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    Form = QtWidgets.QWidget()
    ui = Ui_Form()
    ui.setupUi(Form)
    ui.paintEvent(Form)
    Form.show()
    sys.exit(app.exec_())

Ответы

▲ 0

НИКОГДА НЕ ИЗМЕНЯЙТЕ код, сгенерированный Qt Designer, НИКОГДА.
Создайте другой класс, который наследуется от соответствующего виджета, и используйте созданный класс для его заполнения.


QPainter::QPainter(QPaintDevice *device)

Создает painter , который немедленно начинает рисовать устройство рисования.

from PyQt5 import QtCore, QtWidgets
from PyQt5.QtGui import QPainter, QColor, QPen

class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(400, 400)
        self.label = QtWidgets.QLabel(Form)
        self.label.setGeometry(QtCore.QRect(160, 10, 47, 13))
        self.label.setObjectName("label")

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "Form"))
        self.label.setText(_translate("Form", "TextLabel"))



class MainWindow(QtWidgets.QWidget, Ui_Form):
    def __init__(self):
        super().__init__()
        
        self.setupUi(self)
        
    def paintEvent(self, e):

# !!! так
        painter = QPainter()
        painter.begin(self)                                              # +++
        painter.setPen(QPen(QtCore.Qt.red, 5, QtCore.Qt.SolidLine))
        painter.drawRect(50, 50, 100, 100)
        painter.end()                                                    # +++

# !!! или так
        painter = QPainter(self)                                         # +++ self
        painter.setPen(QColor(0, 0, 222))
        painter.drawRect(250, 50, 100, 100)
        

if __name__ == "__main__":
    import sys
    
    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())

введите сюда описание изображения