在pyside中即时添加小部件

 丹丹2502857623 发布于 2023-02-08 18:07

非常新的pyside所以也许是一个愚蠢的问题.我想创建一个pyside UI,其中包含可变数量的项目,并且还可以在项目运行时添加项目,并使其更加复杂,还需要一个滚动条以使其全部适合屏幕!

这就是我现在所拥有的:

import sys

from PySide import QtGui
from PySide import QtCore 
class example(QtGui.QWidget):

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

        grid = QtGui.QGridLayout()
        grid.setSpacing(10)

        self.widget = QtGui.QWidget()

        self.layout = QtGui.QGridLayout(self)

        for i in range(5):
            btn = QtGui.QPushButton("test"+str(i))
            self.layout.addWidget(btn,i,0)
            btn.clicked.connect(self.buttonClicked)
        self.count = i
        self.widget.setLayout(self.layout)


        self.scroll = QtGui.QScrollArea()
        self.scroll.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn)
        self.scroll.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
        self.scroll.setWidget(self.widget)

        grid.addWidget(self.scroll,3,0)
        self.setLayout(grid)


    def buttonClicked(self):
        title = QtGui.QLabel('Title'+str(self.count))
        self.layout.addWidget(title,self.count + 1,0)
        self.count += 1
        self.widget.addLayout(self.layout,0)
        self.scroll.addWidget(self.widget,0)


if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)

    dialog = example()
    dialog.show()

    sys.exit(app.exec_())

但不知何故,当通过其中一个按钮添加项目时,布局会变得混乱.

有人知道如何解决这个问题吗?

感谢名单!

1 个回答
  • 你离我不远.您缺少的关键部分是QScrollArea.setWidgetResizable,它将确保scrollarea自动调整其视口大小以适应内容.

    我对您的示例进行了一些其他调整,并在适当的地方添加了注释:

    class example(QtGui.QWidget):
        def __init__(self, parent= None):
            super(example, self).__init__()
    
            grid = QtGui.QGridLayout()
            grid.setSpacing(10)
    
            self.widget = QtGui.QWidget()
    
            # set the widget as parent of its own layout
            self.layout = QtGui.QGridLayout(self.widget)
    
            for i in range(5):
                btn = QtGui.QPushButton("test"+str(i))
                self.layout.addWidget(btn,i,0)
                btn.clicked.connect(self.buttonClicked)
    
            # following lines are redundant
            # self.count = i
            # self.widget.setLayout(self.layout)
    
            self.scroll = QtGui.QScrollArea()
            # need this so that scrollarea handles resizing
            self.scroll.setWidgetResizable(True)
            # these two lines may not be needed now
            self.scroll.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn)
            self.scroll.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
    
            self.scroll.setWidget(self.widget)
    
            grid.addWidget(self.scroll, 3, 0)
            self.setLayout(grid)
    
        def buttonClicked(self):
            title = QtGui.QLabel('Title' + str(self.layout.count()))
            self.layout.addWidget(title)
            # following lines are redundant
            # self.layout.addWidget(title, self.count + 1, 0)
            # self.count += 1
            # self.widget.addLayout(self.layout,0)
            # self.scroll.addWidget(self.widget,0)
    

    2023-02-08 18:11 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有