首页 > 解决方案 > 特定 Qframe 上的 PaintEvent

问题描述

我有下面的代码。我正在尝试在特定的 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 它可以工作,所以我假设它与不与 qframe 关联的paintevent有关,但我不知道该怎么做。

标签: pythonpyqtpyqt5

解决方案


推荐阅读