将小部件添加到滚动区域会导致它们堆叠在一起

Posted

技术标签:

【中文标题】将小部件添加到滚动区域会导致它们堆叠在一起【英文标题】:adding QWidgets to scrollArea causes them to pile up on top of eachother 【发布时间】:2016-12-20 10:58:00 【问题描述】:

我在 python 方面有点经验,但时间太长了,所以请耐心等待。

好的,所以我发现了这个非常棒的 PyQt 代码示例,其中一个人将按钮推到滚动区域上,当内容(按钮)溢出时会自动触发滚动条。

所以我去尝试做同样的事情,但将小部件推到滚动区域,这是我的代码:

#!/usr/bin/env python
#-*- coding:utf-8 -*-

from PyQt4 import QtCore, QtGui

class myDialog(QtGui.QWidget):
    _buttons = 0
    def __init__(self, parent=None):
        super(myDialog, self).__init__(parent)

        self.setGeometry(50, 50, 500, 500)

        self.pushButton = QtGui.QPushButton(self)
        self.pushButton.setText(QtGui.QApplication.translate("self", "Add Button!", None, QtGui.QApplication.UnicodeUTF8))
        self.pushButton.clicked.connect(self.on_pushButton_clicked)

        self.scrollArea = QtGui.QScrollArea(self)
        self.scrollArea.setWidgetResizable(True)

        self.scrollAreaWidgetContents = QtGui.QWidget(self.scrollArea)
        self.scrollArea.setWidget(self.scrollAreaWidgetContents)

        self.verticalLayout = QtGui.QVBoxLayout(self)
        self.verticalLayout.addWidget(self.pushButton)
        self.verticalLayout.addWidget(self.scrollArea)

        self.verticalLayoutScroll = QtGui.QVBoxLayout(self.scrollAreaWidgetContents)


    @QtCore.pyqtSlot()
    def on_pushButton_clicked(self):
        self._buttons  += 1
        pustButtonName = u"Button 0".format(self._buttons)

        #pushButton = QtGui.QPushButton(self.scrollAreaWidgetContents)
        #pushButton.setText(pustButtonName)
        muhAlarma = AlarmaWidget(self.scrollAreaWidgetContents)

        self.verticalLayoutScroll.addWidget(muhAlarma)


class AlarmaWidget(QtGui.QWidget):
    def __init__(self, parent):
        super(AlarmaWidget, self).__init__(parent)
        #self.setGeometry(0,0, 30, 30)


        theButton = QtGui.QPushButton(self)
        theButton.setText("It's Friday my dudes.")



if __name__ == "__main__":
    import sys

    app = QtGui.QApplication(sys.argv)

    main = myDialog()

    #main.setWindowFlags(QtCore.Qt.FramelessWindowHint)
    #main.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint)

    #main.showFullScreen()
    main.show()

    sys.exit(app.exec_())

运行此代码并按下按钮后,按钮将开始出现。 然而,最大的问题是,不是填满滚动条区域并启用滚动条,而是按钮最终堆叠在一起,这是为什么呢?

PS:取消注释已注释的 pushButton 行并注释 muhAlarma 行将使该示例再次工作。但是我需要推送自定义小部件,而不是按钮。

提前致谢

【问题讨论】:

【参考方案1】:

将 QWidgets (QPushButton) 添加到 scrollArea。 这是将 QWidgets (QPushButton) 插入到 scrollArea 的示例代码。 请检查此代码。你期待这个结果吗, 如果您不期待这个答案,对不起。 谢谢,苏斌

import sys
from PyQt4 import QtGui
from PyQt4 import QtCore

class myDialog (QtGui.QWidget):

    def __init__(self, parent=None):
        super(myDialog, self).__init__(parent)

        self.button = QtGui.QPushButton (self)
        self.button.setObjectName ('button')
        self.button.setText ('Add Button')        

        self.scrollArea = QtGui.QScrollArea (self)
        self.scrollArea.setWidgetResizable (True)
        self.scrollArea.setObjectName('scrollArea')

        self.scrollAreaWidgetContents = QtGui.QWidget()
        self.scrollAreaWidgetContents.setObjectName('scrollAreaWidgetContents')
        self.scrollArea.setWidget(self.scrollAreaWidgetContents)   

        self.verticalLayout = QtGui.QVBoxLayout (self)
        self.verticalLayout.setObjectName ('verticalLayout')        

        self.verticalLayout.addWidget(self.button)
        self.verticalLayout.addWidget (self.scrollArea)        

        self.verticalLayout_scroll = QtGui.QVBoxLayout (self.scrollAreaWidgetContents)
        self.verticalLayout_scroll.setObjectName ('verticalLayout_scroll')

        self.button.clicked.connect (self.createButtons)

        self.resize(250, 330)


    def createButtons (self) :        
        existsButtonList = []        
        for loop in range (self.verticalLayout_scroll.count ()) :
            if type(self.verticalLayout_scroll.itemAt(loop).widget())==QtGui.QPushButton :
                existsButtonList.append (self.verticalLayout_scroll.itemAt(loop).widget())        

        button_custom   = QtGui.QPushButton (self)
        button_custom.setObjectName ('button%s'% str(len(existsButtonList)+1))
        button_custom.setText ('Add Button - %s'% str(len(existsButtonList)+1))     

        self.verticalLayout_scroll.addWidget(button_custom) 


if __name__=='__main__':
    app = QtGui.QApplication(sys.argv)
    widget = myDialog ()
    widget.show()
    app.exec_()          

【讨论】:

【参考方案2】:

好吧,在几乎发疯了很长一段时间后,我找到了解决方案。 如果有人遇到类似的问题,我会支持你!

AlarmaWidget.__init__

像这样设置一个minimunHeight

self.setMinimumHeight(50)

【讨论】:

以上是关于将小部件添加到滚动区域会导致它们堆叠在一起的主要内容,如果未能解决你的问题,请参考以下文章

将小部件名称与小部件一起添加到主屏幕

将小部件放在 QScrollArea 的中心

将小部件添加到地图会破坏 GWT 中的其他小部件

QDialog 在添加新小部件时将小部件涂成黑色

在滚动区域小部件的 PyQt5 中添加 n 列

Android Widget:在将小部件添加到屏幕之前显示配置活动