繁体   English   中英

PyQt 向 MainWindow 添加滚动条

[英]PyQt add a scrollbar to MainWindow

这是一个反复出现的问题,我已经阅读了许多主题,其中一些有所帮助( python Qt:主要小部件滚动条PyQt:将滚动条放入其中),有些根本没有( PyQt 在我的主窗口中添加了滚动条),我仍然有滚动条的问题。 它们不可用,'是'灰色'。

这是我的代码(我使用的是 PyQt5):

def setupUi(self, Interface):
    Interface.setObjectName("Interface")
    Interface.resize(1152, 1009)
    sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
    sizePolicy.setHorizontalStretch(0)
    sizePolicy.setVerticalStretch(0)
    sizePolicy.setHeightForWidth(Interface.sizePolicy().hasHeightForWidth())
    Interface.setSizePolicy(sizePolicy)
    Interface.setMouseTracking(False)
    icon = QtGui.QIcon()        

    self.centralWidget = QtWidgets.QWidget(Interface)
    self.centralWidget.setObjectName("centralWidget")

    self.scrollArea = QtWidgets.QScrollArea(self.centralWidget)
    self.scrollArea.setGeometry(QtCore.QRect(0, 0, 1131, 951))
    self.scrollArea.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn)
    self.scrollArea.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn)
    self.scrollArea.setWidgetResizable(True)
    self.scrollArea.setObjectName("scrollArea")
    self.scrollArea.setEnabled(True)

    self.scrollAreaWidgetContents = QtWidgets.QWidget()
    self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 1112, 932))
    self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents")

    self.horizontalLayout = QtWidgets.QHBoxLayout(self.scrollAreaWidgetContents)
    self.horizontalLayout.setObjectName("horizontalLayout")

所以我想把滚动条放在主窗口小部件上,所以如果用户调整主窗口的大小,滚动条就会出现,让他上下移动以查看小窗口小部件之外的子部件,允许它向右移动走了。

帮助表示赞赏!

示例代码有几处错误。 主要问题是您没有正确使用布局,并且没有将内容小部件添加到滚动区域。

下面是一个固定版本(注释行都是垃圾,可以删除):

def setupUi(self, Interface):
    # Interface.setObjectName("Interface")
    # Interface.resize(1152, 1009)
    # sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
    # sizePolicy.setHorizontalStretch(0)
    # sizePolicy.setVerticalStretch(0)
    # sizePolicy.setHeightForWidth(Interface.sizePolicy().hasHeightForWidth())
    # Interface.setSizePolicy(sizePolicy)
    # Interface.setMouseTracking(False)
    # icon = QtGui.QIcon()
    self.centralWidget = QtWidgets.QWidget(Interface)
    # self.centralWidget.setObjectName("centralWidget")
    layout = QtWidgets.QVBoxLayout(self.centralWidget)

    self.scrollArea = QtWidgets.QScrollArea(self.centralWidget)
    # self.scrollArea.setGeometry(QtCore.QRect(0, 0, 1131, 951))
    # self.scrollArea.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn)
    # self.scrollArea.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn)
    # self.scrollArea.setWidgetResizable(True)
    # self.scrollArea.setObjectName("scrollArea")
    # self.scrollArea.setEnabled(True)
    layout.addWidget(self.scrollArea)

    self.scrollAreaWidgetContents = QtWidgets.QWidget()
    self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 1112, 932))
    # self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents")

    self.scrollArea.setWidget(self.scrollAreaWidgetContents)

    layout = QtWidgets.QHBoxLayout(self.scrollAreaWidgetContents)
    # self.horizontalLayout.setObjectName("horizontalLayout")
    # add child widgets to this layout...        

    Interface.setCentralWidget(self.centralWidget)

滚动条变灰是因为您通过将滚动条策略设置为Qt.ScrollBarAlwaysOn使它们始终可见,但实际上没有要滚动的内容,因此它们被禁用。 如果您希望滚动条仅在需要时出现,您需要使用Qt.ScrollBarAsNeeded

没有要滚动的内容,因为QHBoxLayout只有 1 self.scrollAreaWidgetContents部件(请参阅self.scrollAreaWidgetContents )。 此外,如果此方法是从QMainWindow执行的,则在设置中央小部件时也会出现错误: self.centralWidget是一种检索中央小部件的方法。 它正在工作,因为您正在使用QWidget实例覆盖它(我相信 python 允许您这样做)。 要正确设置中央小部件,您需要在QMainWindow使用setCentralWidget()

def setupUi(self, Interface):
    Interface.setObjectName("Interface")
    Interface.resize(1152, 1009)
    sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
    sizePolicy.setHorizontalStretch(0)
    sizePolicy.setVerticalStretch(0)
    sizePolicy.setHeightForWidth(Interface.sizePolicy().hasHeightForWidth())
    Interface.setSizePolicy(sizePolicy)
    Interface.setMouseTracking(False)
    icon = QtGui.QIcon()        

    self.horizontalLayout = QtWidgets.QHBoxLayout()
    self.horizontalLayout.setObjectName("horizontalLayout")

    self.scrollArea = QtWidgets.QScrollArea()
    self.scrollArea.setGeometry(QtCore.QRect(0, 0, 1131, 951))
    self.scrollArea.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAsNeeded)
    self.scrollArea.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAsNeeded)
    self.scrollArea.setWidgetResizable(True)
    self.scrollArea.setObjectName("scrollArea")
    self.scrollArea.setEnabled(True)

    self.horizontalLayout.addWidget(self.scrollArea)

    centralWidget = QWidgets.QWidget()
    centralWidget.setObjectName("centralWidget")
    centralWidget.setLayout(self.horizontalLayout)

    self.setCentralWidget(centralWidget)

因为我不知道它是什么,所以我忽略了Interface ,但其余的应该没问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM