Имеют ли вкладки фокус на колесе мыши над ними в прокрутке PyQt5? - PullRequest
0 голосов
/ 25 января 2019

Используя приведенный ниже код, я получаю виджет с вкладками внутри области прокрутки.

Горизонтальные вкладки довольно длинные, что заставляет пользователя использовать полосу прокрутки для перехода вправо, а затем нажимает на крайнюю правую вкладку.chooser, чтобы перейти от вкладки 1 к, скажем, вкладке 5 - я бы хотел избежать этого с помощью колесика мыши.

Однако я получаю следующее поведение:

test-tabs.gif

... то есть:

  • Когда я использую колесико мыши над областью «страницы», оно прокручивается вверх и вниз, как и ожидалось (и требуется)
  • Когда я использую колесико мыши «вниз» над областью вкладок, сначала он переключается с текущей вкладки (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_())
...