Cómo usar QPainter en un QWidget en PyQt4

Mi código de abajo actualmente abre una QMainWindow 500×500 que está en blanco.

Simplemente estoy tratando de dibujar un círculo en el QWidget usando QPainter.

Aquí está mi código:

from PyQt4 import QtCore, QtGui, Qt from PyQt4.QtGui import QApplication, QMainWindow import sys class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.resize(500, 500) self.centralwidget = QtGui.QWidget(MainWindow) self.horizontalLayout = QtGui.QHBoxLayout(self.centralwidget) MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtGui.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 500, 22)) MainWindow.setMenuBar(self.menubar) self.statusbar = QtGui.QStatusBar(MainWindow) MainWindow.setStatusBar(self.statusbar) QtCore.QMetaObject.connectSlotsByName(MainWindow) class MyMainScreen(QMainWindow): def __init__(self, parent=None): QtGui.QMainWindow.__init__(self, parent) self.ui = Ui_MainWindow() # This is from a python export from QtDesigner self.ui.setupUi(self) self.paintCircle() def paintCircle(self): self.painter = QtGui.QPainter(self) self.painter.begin(self) self.painter.setPen(Qt.QPen(Qt.QColor.black)) # painter.end() self.painter.drawArc(QtCore.QRectF(250, 250, 10, 10), 0, 5760) if __name__ == "__main__": app = QApplication(sys.argv) mainscreen = MyMainScreen() mainscreen.show() app.exec_() 

Estoy recibiendo los siguientes errores:

 QPainter::begin: Paint device returned engine == 0, type: 1 QPainter::begin: Paint device returned engine == 0, type: 1 QPainter::setPen: Painter not active 

    Debe anular la función paintEvent , en su caso:

     from PyQt4 import QtCore, QtGui, Qt from PyQt4.QtGui import QApplication, QMainWindow import sys class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.resize(500, 500) self.centralwidget = QtGui.QWidget(MainWindow) self.horizontalLayout = QtGui.QHBoxLayout(self.centralwidget) MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtGui.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 500, 22)) MainWindow.setMenuBar(self.menubar) self.statusbar = QtGui.QStatusBar(MainWindow) MainWindow.setStatusBar(self.statusbar) QtCore.QMetaObject.connectSlotsByName(MainWindow) class MyMainScreen(QMainWindow): def __init__(self, parent=None): QtGui.QMainWindow.__init__(self, parent) self.ui = Ui_MainWindow() # This is from a python export from QtDesigner self.ui.setupUi(self) def paintEvent(self, event): painter = QtGui.QPainter(self) painter.setPen(QtGui.QPen(QtCore.Qt.red)) painter.drawArc(QtCore.QRectF(250, 250, 10, 10), 0, 5760) if __name__ == "__main__": app = QApplication(sys.argv) mainscreen = MyMainScreen() mainscreen.show() app.exec_() 

    Salida:

    introduzca la descripción de la imagen aquí

    Tienes que usar nombre

     def paintEvent(self, event): 

    en lugar de def paintCircle(self): para ejecutarlo automáticamente cuando sea necesario.

     from PyQt4 import QtCore, QtGui, Qt from PyQt4.QtGui import QApplication, QMainWindow import sys class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.resize(500, 500) self.centralwidget = QtGui.QWidget(MainWindow) self.horizontalLayout = QtGui.QHBoxLayout(self.centralwidget) MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtGui.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 500, 22)) MainWindow.setMenuBar(self.menubar) self.statusbar = QtGui.QStatusBar(MainWindow) MainWindow.setStatusBar(self.statusbar) QtCore.QMetaObject.connectSlotsByName(MainWindow) class MyMainScreen(QMainWindow): def __init__(self, parent=None): QtGui.QMainWindow.__init__(self, parent) self.ui = Ui_MainWindow() # This is from a python export from QtDesigner self.ui.setupUi(self) def paintEvent(self, event): self.ui.centralwidget.painter = QtGui.QPainter() self.ui.centralwidget.painter.begin(self) self.ui.centralwidget.painter.setPen(QtGui.QPen(QtCore.Qt.red)) self.ui.centralwidget.painter.drawArc(QtCore.QRectF(250, 250, 10, 10), 0, 5760) self.ui.centralwidget.painter.end() if __name__ == "__main__": app = QApplication(sys.argv) mainscreen = MyMainScreen() mainscreen.show() app.exec_() 

    Ejemplos dibujados en canvas.