2016-10-06 7 views
0

Я некоторое время работал с функциями 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?

+0

Вы используете PySide, не PyQt. Но в любом случае всегда бывает ошибкой пытаться заставить один язык/библиотеку/структуру вести себя точно так же, как другой. – ekhumoro

ответ

0

Вы можете использовать событие-фильтр, чтобы избежать необходимости подкласс QLabel:

class QCustomWidget (QtGui.QWidget): 
    def __init__ (self, parent = None): 
     super(QCustomWidget, self).__init__(parent) 
     self.setWindowOpacity(1) 
     # Init QLabel 
     self.positionQLabel = QtGui.QLabel(self) 
     self.positionQLabel.setMouseTracking(True) 
     self.positionQLabel.installEventFilter(self) 
     # Init QLayout 
     layoutQHBoxLayout = QtGui.QHBoxLayout() 
     layoutQHBoxLayout.addWidget(self.positionQLabel)  
     self.setLayout(layoutQHBoxLayout) 
     self.show() 

    def eventFilter(self, source, event): 
     if event.type() == QtCore.QEvent.MouseMove: 
      self.drawCircle(event.x(), event.y()) 
     return super(QCustomWidget, self).eventFilter(source, event) 

    def drawCircle(self, x, y): 
     # whatever 
+0

большое спасибо. насколько я знаю, функции opencvs gui построены на qt. поэтому мне показалось естественным, чтобы осуществить аналогичную реализацию в обеих рамках. –

+0

@AntonAlice. Я уверен, что есть много совпадений, но очевидно, что некоторые вещи будут работать по-другому. Я думаю, вы обнаружите, что qt предлагает вам много гибкости, но иногда это происходит за счет более подробной реализации. – ekhumoro

+0

вы забыли Q перед QtGui._Label (я) –