Python PySide:QWebView';s鼠标移动和鼠标按下事件冻结html文档
每当我在窗口(而不是标题栏)内拖动鼠标时,我试图使QwebView窗口移动,同时html文档中的事件也会触发 这是我的实现Python PySide:QWebView';s鼠标移动和鼠标按下事件冻结html文档,python,pyqt,pyside,Python,Pyqt,Pyside,每当我在窗口(而不是标题栏)内拖动鼠标时,我试图使QwebView窗口移动,同时html文档中的事件也会触发 这是我的实现 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.QtNetwo
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_()
导入系统
导入json
导入线程
从时间上导入睡眠
从PySide.QtCore导入*
从PySide.QtGui导入*
从PySide.QtWebKit导入QWebView、QWebSettings
从PySide.QtNetwork导入QNetworkRequest
从PySide.QtCore导入QObject、插槽、信号
#html_str=”“.join((打开(“/root/adstar\u gui\u generate.html”,“r”).readlines())
html_str=”“”
书
进驻
运动
.基站{
显示:内联块;
颜色:白色;
背景:黑色;
}
.btns:悬停{
背景:绿色;
光标:指针;
}
"""
班级活动(QObject):
定义初始化(自):
超级(移动、胜利、自我)。\uuuuu初始
@插槽(str)
def移动(自身,位置):
打印位置
pos=json.loads(pos)
#x_w=event.pos().x
#y_w=event.pos().X
拨号.网络视图.移动(位置[“x”]、位置[“y”])
类网络视图(QWebView):
定义初始化(自):
超级(网络视图,自我)。\uuuuu初始化
self.mousedown=None
self.mouseup=None
def mouseReleaseEvent(自身,事件):
self.mouseup=True
self.mousedown=False
def鼠标压力事件(自身、事件):
#self.offset=event.pos()
self.offset=event.pos()
self.mouseup=False
self.mousedown=True
def mouseMoveEvent(自身、事件):
如果self.mousedown为True:
x=event.globalX()
y=事件。全局()
x_w=self.offset.x()
y_w=self.offset.y()
自我移动(x-x\u w,y-y\u w)
如果名称=“\uuuuu main\uuuuuuuu”:
Qapp=QApplication(sys.argv)
t=网络视图()
t、 settings().setAttribute(QWebSettings.WebAttribute.developerxtrasenabled,True)
t、 setHtml(html_str)
t、 show()
QCoreApplication.processEvents()
Qapp.exec()
运行上述代码,您可以看到在html按钮上悬停大多数时间都不起作用(按钮的颜色不会改变光标)。
我的想法 我假设这是由于QWebview本身的mousePressEvent和mouseMoveEvents(我的实现)阻止或导致html文档冻结
注意 如果我从类web_视图中注释掉mousePressEvent和mouseMoveEvent。将鼠标悬停在html按钮上可以工作(按钮更改颜色,光标更改) 我尝试创建一个QThread来确定异步方法是否是解决方案(同样的运气不好) 问题:
如何拖动QWebView窗口而不导致窗口中的html文档冻结(由于我是PySide新手,欢迎使用简单的方法)您忘记调用鼠标*事件的超级方法了 原因:这些方法称为事件处理程序。由于您重写了它,并且没有调用默认实现,QWebView没有机会知道鼠标状态(但它没有“冻结”)
哇…dat simple?。所以超类鼠标事件方法会导致其子类的事件传播?。我认为子类方法应该选择是否将事件传播到其超类。但除此之外:closeEvent@krrr,您可以通过解释为什么需要呼叫super来改进您的答案。这不仅能解决问题,而且有助于理解OP。
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