Как работает QPainter?
Где его надо объявлять и производить рисование ?
У меня он работает через раз, если наследовать класс и там переопределить paintEvent, то все нормально.
Часто выходит такая ошибка:
QWidget::paintEngine: Should no longer be called
QPainter::begin: Paint device returned engine == 0, type: 1
QPainter::end: Painter not active, aborted
Пример кода где проявляется проблема:
from PySide2.QtWidgets import *
from PySide2.QtGui import *
from PySide2.QtMultimediaWidgets import QCameraViewfinder
from PySide2.QtMultimedia import QCamera, QCameraImageCapture, QCameraInfo
class form(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.cameraViewfinder = QCameraViewfinder ()
self.pushButton = QPushButton()
self.pushButton.clicked.connect(self.func)
self.layout=QHBoxLayout()
self.layout.addWidget(self.cameraViewfinder)
self.layout.addWidget(self.pushButton)
self.setLayout(self.layout)
def func (self):
print()
def paintEvent(self,event):
qp = QPainter ()
qp.begin (self.cameraViewfinder)
qp.drawLine (5, 5, 10, 10)
qp.end ()
if __name__ == "__main__":
import sys
app = QApplication(sys.argv)
wform = form ()
wform.show()
sys.exit(app.exec_())
Тут если использовать унаследованный класс, камера на форме не отображается. Если использовать QCameraViewfinder, то отображается. В режиме реального времени на камере нужно рисовать.
from PySide2.QtWidgets import *
from PySide2.QtGui import *
from PySide2.QtMultimediaWidgets import QCameraViewfinder
from PySide2.QtCore import *
from PySide2.QtMultimedia import QCamera, QCameraImageCapture, QCameraInfo
#from PyQt5.Qt import *
class cameraViewfinder2(QCameraViewfinder):
def __init__(self):
super ().__init__ ()
self.flag = False
def paintEvent(self, QPaintEvent):
painter = QPainter (self)
pen = QPen ()
pen.setColor (Qt.green)
painter.setPen (pen)
painter.drawLine (100, 100, 300, 100)
if wform.flag:
pen.setColor (Qt.red)
painter.setPen (pen)
# painter.drawLine(5, 20, 100, 20)3
w, h = wform.size ().width (), wform.size ().height ()
painter.drawLine (wform.cameraMoi.pos (),
wform.cameraMoi.pos () + QPoint (w, h) - wform.cameraMoi.pos () * 2)
wform.flag = False # попробуйте изменить размер окна
class form (QWidget):
def __init__(self):
super ().__init__ ()
self.flag = False
self.initUI ()
def initUI(self):
self.pushButton = QPushButton ()
self.pushButton.clicked.connect (self.func)
self.layout = QHBoxLayout ()
self.setLayout (self.layout)
self.cameraView = cameraViewfinder2 ()
self.cameraInfo = QCameraInfo.defaultCamera ()
self.camera = QCamera (self.cameraInfo)
self.camera.setViewfinder (self.cameraView)
self.imageCapture = QCameraImageCapture (self.camera)
self.camera.setCaptureMode (QCamera.CaptureStillImage)
self.layout.addWidget (self.pushButton)
self.layout.addWidget (self.cameraView)
if self.camera.status () != QCamera.UnavailableStatus:
self.camera.start ()
def func(self):
self.flag = True
self.cameraView.update ()
if __name__ == "__main__":
import sys
app = QApplication (sys.argv)
wform = form ()
wform.resize (400, 300)
wform.show ()
sys.exit (app.exec_ ())
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
попробуйте так:
'''
from PySide2.QtWidgets import *
from PySide2.QtGui import *
from PySide2.QtMultimediaWidgets import QCameraViewfinder
from PySide2.QtMultimedia import QCamera, QCameraImageCapture, QCameraInfo
'''
import sys
from PyQt5.Qt import *
class form(QWidget):
def __init__(self):
super().__init__()
self.flag = False # +
self.initUI()
def initUI(self):
self.cameraViewfinder = QCameraViewfinder()
self.pushButton = QPushButton()
self.pushButton.clicked.connect(self.func)
self.layout = QHBoxLayout()
self.layout.addWidget(self.cameraViewfinder)
self.layout.addWidget(self.pushButton)
self.setLayout(self.layout)
def func(self):
self.flag = True
self.update()
def paintEvent(self, QPaintEvent):
painter = QPainter(self)
pen = QPen()
pen.setColor(Qt.green)
painter.setPen(pen)
painter.drawLine(100, 100, 300, 100)
if self.flag:
pen.setColor(Qt.red)
painter.setPen(pen)
#painter.drawLine(5, 20, 100, 20)
w, h = self.size().width(), self.size().height()
painter.drawLine(self.cameraViewfinder.pos(),
self.cameraViewfinder.pos()+QPoint(w, h)-self.cameraViewfinder.pos()*2)
self.flag = False # попробуйте изменить размер окна
if __name__ == "__main__":
import sys
app = QApplication(sys.argv)
wform = form ()
wform.resize(400, 300)
wform.show()
sys.exit(app.exec_())
