que pyside2 python pyqt pyside

python - que - pyside2



PySide: el movimiento del mouse de QWebView y los eventos de Mouse Press Freezing html document (1)

Estoy tratando de mover una ventana de QwebView cada vez que arrastro el mouse dentro de la ventana (no la barra de título) mientras que al mismo tiempo pueden activarse los eventos en los documentos html.

Aquí está mi implementación de esto

import sys import json import threading from time import sleep from PySide.QtCore import * from PySide.QtGui import * from PySide.QtWebKit import QWebView, QWebSettings from PySide.QtNetwork import QNetworkRequest from PySide.QtCore import QObject, Slot, Signal #html_str="".join((open("/root/adstar_gui_generate.html","r").readlines())) html_str=""" <!doctype> <body> <html> <div class="btns">Books</div> <div class="btns">Enteraintment</div> <div class="btns">Sport</div> </html> <style> .btns{ display:inline-block; color:white; background:black; } .btns:hover{ background:green; cursor:pointer; } </style> </body> </doctype> """ class move_win(QObject): def __init__(self): super(move_win,self).__init__() @Slot(str) def move(self,pos): print pos pos=json.loads(pos) #x_w = event.pos().X #y_w = event.pos().X dial.webview.move(pos["x"],pos["y"]) class web_view(QWebView): def __init__(self): super(web_view,self).__init__() self.mousedown=None self.mouseup=None def mouseReleaseEvent(self,event): self.mouseup=True self.mousedown=False def mousePressEvent(self, event): #self.offset = event.pos() self.offset = event.pos() self.mouseup=False self.mousedown=True def mouseMoveEvent(self, event): if self.mousedown is True: x=event.globalX() y=event.globalY() x_w = self.offset.x() y_w = self.offset.y() self.move(x-x_w, y-y_w) if __name__=="__main__": Qapp=QApplication(sys.argv) t=web_view() t.settings().setAttribute(QWebSettings.WebAttribute.DeveloperExtrasEnabled, True) t.setHtml(html_str) t.show() QCoreApplication.processEvents() Qapp.exec_()

Al ejecutar los códigos anteriores, se puede ver que al pasar el ratón sobre los botones html no funciona la mayor parte del tiempo (el color del botón no cambia ni el cursor).

Mis pensamientos

Estoy asumiendo que esto se debe a mousePressEvent y mouseMoveEvents de QWebview Itself (bueno, mi implementación del mismo) evitando o haciendo que el documento html se congele.

Nota

Si comenté el mousePressEvent y mouseMoveEvent de la clase web_view. al pasar el mouse sobre los botones html (los botones cambian de color y el cursor cambia)

Intenté crear un QThread para determinar si un enfoque asincrónico puede ser la solución (la misma mala suerte) ...

Pregunta:

¿Cómo se puede arrastrar la ventana de QWebView sin que se congele el documento html en la ventana? (Se dará la bienvenida a un enfoque simple ya que soy nuevo en PySide)


Olvidaste llamar a los súper métodos del mouse * Event.

Motivo: esos métodos se llaman controlador de eventos. Como lo anuló y no llamó a la implementación predeterminada, QWebView no tiene la oportunidad de conocer los estados del mouse (pero no se "congeló").

Visión general de los eventos Qt

class web_view(QWebView): def __init__(self): super(web_view,self).__init__() self.mousedown=None self.mouseup=None def mouseReleaseEvent(self,event): self.mouseup=True self.mousedown=False super(web_view, self).mouseReleaseEvent(event) # here def mousePressEvent(self, event): #self.offset = event.pos() self.offset = event.pos() self.mouseup=False self.mousedown=True super(web_view, self).mousePressEvent(event) # here def mouseMoveEvent(self, event): if self.mousedown is True: x=event.globalX() y=event.globalY() x_w = self.offset.x() y_w = self.offset.y() self.move(x-x_w, y-y_w) super(web_view, self).mouseMoveEvent(event) # here