Я некоторое время работал с функциями GUI OpenCV, и возможности немного ограничивают пользователей python. Сегодня я начал с Pyqt и пришел к следующему выводу: qt действительно запутан.Обработка событий мыши opencv gui vs pyqt
Теперь вопрос относительно событий мыши:
В OpenCV Я просто сделать следующее:
import cv2
cv2.namedWindow('Window',1)
def CallBackFunc(event,x,y,flags,param):
global xc,yc,evt,flg
xc,yc,evt,flg=x,y,event,flags
cv2.setMouseCallback('Window', CallBackFunc)
Это открывает отдельный поток, который постоянно обновляет глобальные переменные xc,yc,evt,flg
, и я могу получить доступ к ним в любом месте , в любое время я хочу. Если я хочу, чтобы остановить освежающие, я просто сделать cv2.setMouseCallback('Window',nothing)
, в результате чего nothing
является
def nothing():
pass
Это может быть не самым красивым способом борьбы с событиями мыши, но я хорошо с ним. Как я могу добиться такой свободы с PyQt?
EDIT:
Например, следующий скрипт отображает белый круг, постоянно рисуя в него текст.
import sys
from PySide import QtGui
import numpy as np
import cv2
class QCustomLabel (QtGui.QLabel):
def __init__ (self, parent = None):
super(QCustomLabel, self).__init__(parent)
self.setMouseTracking(True)
def mouseMoveEvent (self, eventQMouseEvent):
self.x,self.y=eventQMouseEvent.x(),eventQMouseEvent.y()
cvImg=np.zeros((900,900),dtype=np.uint8)
cv2.circle(cvImg,(449,449),100,255,-1)
cv2.putText(cvImg,"x at {}, y at {}".format(self.x,self.y),(375,455), cv2.FONT_HERSHEY_SIMPLEX,0.5,(0,0,0),1,cv2.LINE_AA)
height, width= cvImg.shape
bytearr=cvImg.data
qImg = QtGui.QImage(bytearr, width, height, QtGui.QImage.Format_Indexed8)
self.setPixmap(QtGui.QPixmap.fromImage(qImg))
def mousePressEvent (self, eventQMouseEvent):
self.evt=eventQMouseEvent.button()
class QCustomWidget (QtGui.QWidget):
def __init__ (self, parent = None):
super(QCustomWidget, self).__init__(parent)
self.setWindowOpacity(1)
# Init QLabel
self.positionQLabel = QCustomLabel(self)
# Init QLayout
layoutQHBoxLayout = QtGui.QHBoxLayout()
layoutQHBoxLayout.addWidget(self.positionQLabel)
self.setLayout(layoutQHBoxLayout)
self.show()
if QtGui.QApplication.instance() is not None:
myQApplication=QtGui.QApplication.instance()
else:
myQApplication = QtGui.QApplication(sys.argv)
myQTestWidget = QCustomWidget()
myQTestWidget.show()
myQApplication.exec_()
Проблема здесь в том, что это все выполняется внутри QCustomLabel класса, а внутри функции MouseMoveEvent. Но я хочу отдельную функцию, давая ей вызов drawCircle
, вне этого класса, который имеет доступ к позиции мыши и событиям. С opencv это не будет проблемой. И потребуется лишь небольшая часть усилий по написанию, которая необходима для реализации pyqt.
Я думаю, что правильный вопрос: почему мне еще не нравится pyqt?
Вы используете PySide, не PyQt. Но в любом случае всегда бывает ошибкой пытаться заставить один язык/библиотеку/структуру вести себя точно так же, как другой. – ekhumoro