Используя приведенный ниже код, я получаю виджет с вкладками внутри области прокрутки.
Горизонтальные вкладки довольно длинные, что заставляет пользователя использовать полосу прокрутки для перехода вправо, а затем нажимает на крайнюю правую вкладку.chooser, чтобы перейти от вкладки 1 к, скажем, вкладке 5 - я бы хотел избежать этого с помощью колесика мыши.
Однако я получаю следующее поведение:
... то есть:
- Когда я использую колесико мыши над областью «страницы», оно прокручивается вверх и вниз, как и ожидалось (и требуется)
- Когда я использую колесико мыши «вниз» над областью вкладок, сначала он переключается с текущей вкладки (N) на следующую (N + 1) вкладку - , а затем переходит к прокрутке вниз при дальнейшем вращении колесика мыши, что я делаю не хочу
- Когда я использую колесико мыши "вверх" над областью вкладок, оно переходит от текущей вкладки (N) к предыдущей (N-1) вкладка - вплоть до вкладки 1 о дальнейших событиях при наведении мыши, чего я и хочу
Итак, вкратце - когдамышь находится над областью вкладок, я хотел бы, чтобы события колесика мыши были вверх / вниз, чтобы только переключался между вкладками, а не делал какую-либо прокрутку - и как только мышь выходит за пределыобласть вкладок и в области «страницы», то есть, когда я хочу прокрутить колесико мыши.Как мне этого добиться?
Код, test-tabs.py
:
from PyQt5 import QtCore, QtGui, QtWidgets
import sys, os
class DataItem(object):
def __init__(self):
self.label = ""
self.type = "" # SECTION or LINE
self.children = []
class SectionWidget(QtWidgets.QWidget):
def __init__(self, indataitem, parent=None):
QtWidgets.QWidget.__init__(self, parent)
self.setLayout(QtWidgets.QFormLayout())
child_count = len(indataitem.children)
if child_count < 1:
return
tabs = None
for child in indataitem.children:
label = child.label
child_type = child.type
if child_type == "SECTION":
if not tabs:
tabs = QtWidgets.QTabWidget()
self.layout().insertRow(0, tabs)
tabs.addTab(SectionWidget(child), label)
elif child_type == "LINE":
self.layout().addRow(label.upper(), QtWidgets.QPushButton(label, self))
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.setMinimumSize(600, 400)
self.frame = QtWidgets.QFrame(self)
self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.framelayout = QtWidgets.QHBoxLayout(self.frame)
self.framelayout.setSpacing(0);
self.framelayout.setContentsMargins(0,0,0,0);
self.scroll = QtWidgets.QScrollArea(self)
self.scroll.setWidgetResizable(False)
self.scroll.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn)
self.scroll.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn)
self.framelayout.addWidget(self.scroll)
self.widget = QtWidgets.QWidget()
self.widget.setLayout(QtWidgets.QGridLayout())
self.widget.setStyleSheet("""
.QWidget { border: 2px solid blue; border-radius: 2px; background-color: rgb(30, 255, 30); }
""")
self.uidata = DataItem()
LINESPERROUND=10
for ix in range(5):
theading = DataItem()
theading.label = "Very-very-very-very-very-long-heading-{:02d}".format(ix+1)
theading.type = "SECTION"
for iy in range(LINESPERROUND*(ix+1)):
tline = DataItem()
tline.label = (ix+1)*"Entry-{:02d}-{:02d}".format(ix+1, iy+1)
tline.type = "LINE"
theading.children.append(tline)
self.uidata.children.append(theading)
self.uisection = SectionWidget(self.uidata)
self.widget.layout().addWidget(self.uisection, 0, 0, 1, 3)
self.widget.layout().setColumnStretch(0, 1)
self.scroll.setWidget(self.widget)
self.setCentralWidget(self.frame)
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.resize(640, 480)
w.show()
sys.exit(app.exec_())