Python 特定Qframe上的PaintEvent

Python 特定Qframe上的PaintEvent,python,pyqt,pyqt5,Python,Pyqt,Pyqt5,我有下面的代码。我试图在一个特定的qframe上绘制,并每16毫秒更新一次 from PyQt5 import QtCore, QtGui, QtWidgets class Ui_test_app(object): def setupUi(self, test_app): test_app.setObjectName("test_app") test_app.resize(800, 600) self.main_widget = QtWi

我有下面的代码。我试图在一个特定的qframe上绘制,并每16毫秒更新一次

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_test_app(object):
    def setupUi(self, test_app):
        test_app.setObjectName("test_app")
        test_app.resize(800, 600)
        self.main_widget = QtWidgets.QWidget(test_app)
        self.main_widget.setObjectName("main_widget")

        self.verticalLayoutWidget = QtWidgets.QWidget(self.main_widget)
        self.verticalLayoutWidget.setGeometry(QtCore.QRect(9, 480, 781, 71))
        self.verticalLayoutWidget.setObjectName("verticalLayoutWidget")

        self.btn = QtWidgets.QVBoxLayout(self.verticalLayoutWidget)
        self.btn.setContentsMargins(0, 0, 0, 0)
        self.btn.setObjectName("btn")

        self.pushButton = QtWidgets.QPushButton(self.verticalLayoutWidget)
        self.pushButton.setObjectName("pushButton")

        self.btn.addWidget(self.pushButton)

        self.canvas = QtWidgets.QFrame(self.main_widget)
        self.canvas.setGeometry(QtCore.QRect(120, 30, 541, 331))
        self.canvas.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.canvas.setFrameShadow(QtWidgets.QFrame.Raised)
        self.canvas.setObjectName("canvas")

        test_app.setCentralWidget(self.main_widget)

        self.menubar = QtWidgets.QMenuBar(test_app)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 22))
        self.menubar.setObjectName("menubar")
        test_app.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(test_app)
        self.statusbar.setObjectName("statusbar")
        test_app.setStatusBar(self.statusbar)
        self.simulation_timer = QtCore.QTimer(
            interval=16, timeout=self.perform_simulation_iteration
        )
        self.simulation_timer.start()

        QtCore.QMetaObject.connectSlotsByName(test_app)

    def perform_simulation_iteration(self):
        print('run sim')
        self.canvas.update()

    def paintEvent(self,event):
        print('run paint')
        painter = QtGui.QPainter(self)
        painter.setPen(QtGui.QPen(QtCore.Qt.red))
        painter.drawArc(QtCore.QRectF(250, 250, 10, 10), 0, 5760)


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    test_app = QtWidgets.QMainWindow()
    ui = Ui_test_app()
    ui.setupUi(test_app)
    test_app.show()
    sys.exit(app.exec_())

如果我在没有主窗口的情况下做同样的事情,只需要一个qwidget和一个qframe就可以了,所以我假设这与paintevent没有关联到qframe有关,但我不知道如何做

这根本不应该起作用,因为永远不应该调用paintEvent方法。我不知道这是怎么回事。最好的方法是将QFrame子类化,并在那里重载paintEvent方法。是的,这就是问题所在,它不起作用。我想我现在明白了。我应该把paintevent放在Qwidget里,而不是主窗口。是的,我想你明白我的意思了。现在的问题是,Ui_test_app类甚至不是Qt中的任何对象。它只是一个普通的python类。只需将QWidget子类化,就可以开始了