QWidget画家

QWidget painter

我有这个代码:

import sys, random, pprint
from PyQt5 import QtWidgets, QtGui, QtCore
from PyQt5 import QtGui
from PyQt5.QtCore import Qt

class Window(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):
        self.setGeometry(QtCore.QRect(200, 200, 700, 700))

        self.widget = QtWidgets.QWidget(self)
        self.widget.setGeometry(QtCore.QRect(10, 10, 400, 200))
        self.widget.setObjectName("widget")
        
    def paintEvent(self, event):
        painter = QtGui.QPainter()
        painter.begin(self.widget)
        self.drawPoints(painter)
        painter.end()

    def drawPoints(self, painter):
        #drawing code


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    ex = Window()
    ex.show()
    sys.exit(app.exec_())

我期望什么:drawPoints() 将绘制的区域 (400x200)。 QWidget 继承 QPaintDevice。所以这段代码应该可以工作。但是控制台说:

QPainter::begin: Paint device returned engine == 0, type: 1

QPainter::end: Painter not active, aborted

你能帮帮我吗

您似乎在尝试复制 this example,对吗?

主要区别似乎是您为主要 window 定义了 paintEvent(),而不是您实际尝试绘制的小部件。如果您创建了 QWidget 的自定义子类,在其中定义了 paintEvent(),然后将其插入到标准 QMainWindow 实例中,它将起作用,如下所示:

class MyWidget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(MyWidget, self).__init__(parent=parent)

        self.initUI()

    def initUI(self):
        self.setGeometry(QtCore.QRect(10, 10, 400, 200))
        self.setObjectName("widget")

    def paintEvent(self, event):
        painter = QtGui.QPainter()
        painter.begin(self)
        self.drawPoints(painter)
        painter.end()

    def drawPoints(self, painter):
        pass


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    my_window = QtWidgets.QMainWindow()
    my_window.setGeometry(QtCore.QRect(200, 200, 700, 700))
    my_window.setCentralWidget(MyWidget(my_window))
    my_window.show()
    sys.exit(app.exec_())

至少,它不再打印该错误消息。