问题描述
在接受QTapGesture的QTabWidget上,点击会生成3个事件:第一个事件的手势状态为GestureStarted,第二个事件的手势状态为GestureUpdated,第三个事件的手势状态为GestureFinished。 QTapGesture.position()返回的QPointF在第一个事件和其他事件之间是不同的。看起来第一个值是相对于整个QTabWidget的,而其他两个值是相对于QStackedWidget的。区别在于QTabBar的大小。我希望所有情况下的职位都保持不变。在不继承qtabbar和qtabwidget子类的情况下,如何知道全局抽头位置? 我正在从标准存储库中运行Ubuntu 19.10 eoan,python3-pyqt5 5.12.3。
$ python3 minimal_tap_on_qtabwidget.py
tap state 1
tap position PyQt5.QtCore.QPointF(108.02645874023438,64.21989440917969)
tabBar size PyQt5.QtCore.QSize(85,35)
tap state 2
tap position PyQt5.QtCore.QPointF(106.02645874023438,29.219894409179688)
tabBar size PyQt5.QtCore.QSize(85,35)
tap state 3
tap position PyQt5.QtCore.QPointF(106.02645874023438,35)
在此处,向北具有标准的tabBar,不同之处在于Y坐标。使用向西的tabBar时,差异将在X坐标上。
# minimal_tap_on_qtabwidget.py
import sys
from PyQt5 import Qt,QtCore
class TabWidget(Qt.QTabWidget):
def __init__(self,*args,**kwargs):
super(TabWidget,self).__init__(*args,**kwargs)
self.addTab(Qt.QWidget(),Qt.QIcon(),'mytab')
self.grabGesture(QtCore.Qt.TapGesture)
def event(self,event):
if event.type() == Qt.QEvent.Gesture:
return self.on_gesture_event(event)
return super(TabWidget,self).event(event)
def on_gesture_event(self,gesture_event):
gesture_event.accept()
tap = gesture_event.gesture(QtCore.Qt.TapGesture)
if tap:
print('tap state {}'.format(tap.state()))
self.on_tap(tap)
return True
def on_tap(self,tap_gesture):
tap_pos = tap_gesture.position()
print('tap position {}'.format(tap_pos))
print('tabBar size {}'.format(self.tabBar().size()))
def main():
qapp = Qt.QApplication([])
qapp.setAttribute(QtCore.Qt.AA_SynthesizeMouseForUnhandledTouchEvents,False)
tab_widget = TabWidget()
tab_widget.show()
sys.exit(qapp.exec_())
if __name__ == '__main__':
main()
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)