我對 eventFilter 感到困惑。我希望QTabWidget在滑鼠懸停并在其上滾動時完全禁用滾動。
例如,我制作了一個 eventFilter,它QScrollArea在滑鼠懸停和滾動時滾動QTabWidget。它QTabWidget也可以滾動和更改值。
我嘗試使用 return False、True 或 event.ignore() 它仍然無法QTabWidget停止更改值。
這是我的事件過濾器代碼:
def eventFilter(self, obj, event):
# If mouse hovering genreTabData and wheel did scrolling
if obj is self.genreTabData and event.type() == QtCore.QEvent.Wheel:
self.scrollArea.horizontalScrollBar().setValue(self.scrollArea.horizontalScrollBar().value() -event.angleDelta().y())
# Stop QTabWidget being change value after above code
# Tried return False, True, and event.ignore() but did not work
return super(mainForm, self).eventFilter(obj, event)
這是我的完整代碼作為示例:
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import QEvent
import sys
class mainForm(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.setupUi(self)
self.genreTabData.installEventFilter(self)
def setupUi(self, Form):
Form.resize(400, 101)
self.scrollArea = QtWidgets.QScrollArea(Form)
self.scrollArea.setGeometry(QtCore.QRect(10, 10, 381, 81))
self.scrollArea.setStyleSheet("QScrollBar:horizontal {height:12px;}\nQScrollBar:page:horizontal {border: 0px solid #999999;background-color: rgb(34, 35, 52);width:15px;margin: 0px 0px 0px 3px;}\nQScrollBar::handle:page:horizontal {min-height: 0px;border: 0px solid red;border-radius: 5px;background-color: rgb(92, 95, 141);}\nQScrollBar::add-line:horizontal {height: 0px;subcontrol-position: bottom;subcontrol-origin: margin;}\nQScrollBar::sub-line:horizontal {height: 0 px;subcontrol-position: top;subcontrol-origin: margin;}")
self.scrollArea.setWidgetResizable(True)
self.scrollAreaWidgetContents = QtWidgets.QWidget()
self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 584, 67))
self.horizontalLayout = QtWidgets.QHBoxLayout(self.scrollAreaWidgetContents)
self.genreTabData = QtWidgets.QTabWidget(self.scrollAreaWidgetContents)
self.genreTabData.setMinimumSize(QtCore.QSize(0, 40))
self.genreTabData.setStyleSheet("QTabWidget::tab-bar {border: 1px solid gray;}\nQTabBar::tab {height: 20px; width: 100px; background: #EFF4F8; color: black; padding: 10px; border-radius: 15px; margin-left:10px; margin-right:10px;}\nQTabBar::tab:selected {background: #c3daf5;}\nQTabWidget::pane {border: none;}")
self.genreTabData.setUsesScrollButtons(False)
tabs = ["Test tab", "Test tab", "Test tab", "Test tab"]
for tab in tabs:
tabWidget = QtWidgets.QWidget()
self.genreTabData.addTab(tabWidget, tab)
self.horizontalLayout.addWidget(self.genreTabData)
self.scrollArea.setWidget(self.scrollAreaWidgetContents)
def eventFilter(self, obj, event):
if obj is self.genreTabData and event.type() == QtCore.QEvent.Wheel:
self.scrollArea.horizontalScrollBar().setValue(self.scrollArea.horizontalScrollBar().value() -event.angleDelta().y())
return True
return super(mainForm, self).eventFilter(obj, event)
app = QtWidgets.QApplication(sys.argv)
w = mainForm()
w.show()
sys.exit(app.exec_())
uj5u.com熱心網友回復:
The wheel event is managed by the tab bar, not the tab widget, so you need to install the filter on its tabBar():
self.genreTabData.tabBar().installEventFilter(self)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/430367.html
標籤:python-3.x pyqt5
