2016-03-21 17 views
0

我有一個列表,每次用戶打開文件時都會獲取一個元素。我需要創建一個帶有文件名稱(列表中的元素)的按鈕,每次將該文件附加到列表中,並將該按鈕放入滾動區域。如何爲列表中的每個元素創建一個按鈕並將其放入滾動區?

的問題是,我始終只有一個按鈕,只是改變了它的名字:

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) 

我知道,問題是,我同一個對象(按鈕)添加到滾動區,但我不知道如何解決它。

回答

1

問題不在於您添加了相同的按鈕,而是您在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_()) 
+0

我一直在努力做到這一點一個星期,最後它的工作。你甚至無法想象我有多偉大。謝謝 !! –

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) 
相關問題