2016-12-14 5 views
0

В моем приведенном ниже коде в настоящее время открывается пустое поле 500x500 QMainWindow.Как использовать QPainter в QWidget в PyQt4

Я просто пытаюсь нарисовать круг в QWidget, используя QPainter.

Вот мой код:

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_() 

Я получаю следующие ошибки:

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

ответ

2

Вы должны переопределить функцию paintEvent, в вашем случае:

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_() 

Выход:

enter image description here

+0

Как я могу запустить его при двойном щелчке? –

+0

двойной щелчок, где ?? – eyllanesc

+0

В поле, в основном, я думал, что могу сказать, если событие == QtCore.QEvent.MouseButtonDblClick, затем drawArc, но событие ВСЕГДА QPaintEvent.paint каждый раз, очевидно, –

1

Вы должны не использовать имя

def paintEvent(self, event): 

вместо def paintCircle(self): запустить его автоматически когда это необходимо.

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_() 

Примеры draw on canvas

+0

Нет необходимости хранить ссылку на 'QPainter' следующим образом: просто используйте локальную переменную. – ekhumoro

+0

@ekhumoro Я использовал код OP и внес минимальные изменения. – furas