2016-03-21 3 views
0

私はユーザーがファイルを開くたびに1つの要素を取得するリストを持っています。このファイルがリストに追加されるたびに、ファイルの名前(リストの要素)を含むボタンを作成し、このボタンをスクロール領域に配置する必要があります。リスト内の各要素のボタンを作成してスクロール領域に入れる方法は?

問題だけでその名前を変更することを、私はいつも一つだけのボタンを持っていることです。

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内のウィジェットを置き換えることをソートすることです。

より良い方法は、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

私はそれをやろうとしてきましたついに1週間、そしてそれは最終的に動作します。あなたは私がどれほど素晴らしいことを想像することすらできません。感謝!! –

0

問題はあなたがscrollAreaのウィジェットを設定している、scrollLayoutをにレイアウトを追加していないということです。

#!/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) 
関連する問題