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 pensamientosEstoy 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.
NotaSi 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