如何为列表中的每个元素创建一个按钮并将其放在滚动区域中?

时间:2016-03-21 17:25:19

标签: python qt pyqt qpushbutton qscrollarea

我有一个列表,每次用户打开文件时都会获得一个元素。我需要创建一个带有文件名称(列表中的元素)的按钮,每次将此文件附加到列表中,并将此按钮放入滚动区域。

问题是我总是只有一个按钮,只是改变了它的名字:

filenames = []
def addfiles():
    fileName = QtGui.QFileDialog.getOpenFileName()
    fileDirectory = unicode(fileName)  
    global filenames
    filenames.append(fileDirectory)
    button = QtGui.QPushButton(os.path.basename(fileDirectory))
    window.scrollArea.setWidget(button)

我知道问题是我将相同的对象(按钮)添加到滚动区域,但我不知道如何修复它。

2 个答案:

答案 0 :(得分:2)

问题不是你添加了相同的按钮,而是你在scrollArea中替换了Widget。

更好的方法是创建一个QHBoxLayout,然后将按钮添加到布局中。

filenames = []
lay = QtGui.QHboxLayout()
window.scrollArea.setLayout(lay)
def addfiles():
    fileName= QtGui.QFileDialog.getOpenFileName()
    fileDirectory = unicode(fileName)  
    global filenames
    filenames.append(fileDirectory)
    button = QtGui.QPushButton(os.path.basename(fileDirectory))
    lay.addWidget(button)

以某种方式它应该工作。这是一个小工作示例:

from PyQt4 import QtGui
import sys

filenames = []

class TestGui(QtGui.QWidget):
    """ A Fast test gui show how to create buttons in a ScrollArea"""
    def __init__(self):
        super(TestGui, self).__init__()
        self.lay = QtGui.QHBoxLayout()
        self.sA = QtGui.QScrollArea()
        self.sA_lay = QtGui.QVBoxLayout()
        self.sA.setLayout(self.sA_lay)
        self.closeGui = QtGui.QPushButton("Close")
        self.add_file_button = QtGui.QPushButton("Add File")
        self.lay.addWidget(self.closeGui)
        self.lay.addWidget(self.add_file_button)
        self.lay.addWidget(self.sA)
        self.setLayout(self.lay)
        self.connect_()
        self.show()

    def connect_(self):
        self.add_file_button.clicked.connect(self.__add_file_to_list)
        self.closeGui.clicked.connect(self.close)
        return

    def __add_file_to_list(self):
        fname = QtGui.QFileDialog.getOpenFileName()
        global filenames
        filenames.append(fname)
        button = QtGui.QPushButton(fname)
        self.sA_lay.addWidget(button)
        return


if __name__ == '__main__':
     app = QtGui.QApplication(sys.argv)
     tg = TestGui()
     sys.exit(app.exec_())

答案 1 :(得分:0)

问题是你没有向scrollLayout添加布局,你正在设置scrollArea的小部件:

#!/usr/bin/env python
import os, sys
from PyQt4 import QtCore, QtGui


filenames = []


class Window(QtGui.QMainWindow):

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

        self.centralwidget = QtGui.QWidget(self)
        self.verticalLayout = QtGui.QVBoxLayout(self.centralwidget)
        self.scrollArea = QtGui.QScrollArea(self.centralwidget)
        self.scrollArea.setWidgetResizable(True)

        self.scrollAreaWidgetContents = QtGui.QWidget(self.scrollArea)
        self.scrollArea.setWidget(self.scrollAreaWidgetContents)
        self.verticalLayout.addWidget(self.scrollArea)
        self.setCentralWidget(self.centralwidget)

        # create a layout for your scrollarea
        self.formLayout = QtGui.QFormLayout(self.scrollAreaWidgetContents)
        self.addFiles()

    def addFiles(self):
        global filenames
        filenames.append("~/files/newFile.txt")
        button = QtGui.QPushButton(os.path.basename(filenames[-1]))
        self.formLayout.addWidget(button)