2013-11-28 2 views
2

Я очень новичок в PyQt и Python. Я все еще пытаюсь понять многое.PyQt помочь новичкам, пожалуйста, заполните QListWidget, используя getOpenFileNames

В приведенном ниже примере я хотел бы заполнить свой QListWidget файлами, открыв Qdialog. Я не понимаю, как я могу добавить файлы, выбранные в списке. Должен ли я сделать новый класс? Как я могу подключить два метода setupList и addFiles?

import sys 
from PyQt4 import QtCore, QtGui 

from datapath import * 

class MainWindow(QtGui.QMainWindow): 

    def __init__(self): 
     super(MainWindow,self).__init__() 

     self.sources =[] 

     self.setupActions() 
     self.setupList() 
     self.setupUi() 
     self.setupStatusBars() 

    def addFiles(self): 
     files = QtGui.QFileDialog.getOpenFileNames(
      self,"Open File", dirpath, "txt Files (*.txt)") 

     for string in files: 
      self.sources.append(str(string)) 

     return self.sources 

    def setupActions(self): 
     self.exitAct = QtGui.QAction(
      QtGui.QIcon(':/images/exit.png'), 
      "E&xit", self, shortcut="Ctrl+Q", 
      statusTip="Exit the application", triggered=self.close 
      ) 

     self.addFilesAct = QtGui.QAction(
      QtGui.QIcon(':/images/open.png'), 
      "Add &Files", self, shortcut=QtGui.QKeySequence.Open, 
      statusTip="Open an existing file", triggered=self.addFiles 
      ) 

    def setupList(self): 
     #FileList 
     self.FileList = QtGui.QListWidget(self) 
     self.FileList.addItems(self.sources) 

    def setupUi(self): 
     #Window size 
     horiz = 300 
     vert = 300 
     self.setGeometry(self.width()/2, self.height()/2,horiz,vert) 
     self.setWindowTitle("test") 

     #MenuBar 
     self.FileMenu = self.menuBar().addMenu("&File") 
     self.FileMenu.addAction(self.addFilesAct) 
     self.FileMenu.addSeparator(); 
     self.FileMenu.addAction(self.exitAct) 

     #ToolBar 
     self.fileToolBar = self.addToolBar("Open") 
     self.fileToolBar.addAction(self.addFilesAct) 
     self.fileToolBar.setIconSize(QtCore.QSize(64,64)) 

     #Build Layout 
     mainLayout = QtGui.QVBoxLayout() 
     mainLayout.addWidget(self.FileList) 

     widget = QtGui.QWidget() 
     widget.setLayout(mainLayout) 

     self.setCentralWidget(widget) 

    def setupStatusBars(self): 
     self.statusBar().showMessage("Ready") 


def main(): 
    app = QtGui.QApplication(sys.argv) 
    mw = MainWindow() 
    mw.show() 
    sys.exit(app.exec_()) 

if __name__ == '__main__': 

    main() 

ответ

1

Когда self.sources изменяется, элементы QListWidget не изменится. Поэтому self.FileList.addItems(self.sources) в setupList() следует удалить и вместо этого поместить в addFiles(), чтобы каждый раз, когда файлы были выбраны в диалоговом окне, вызывается метод addItems QListWidget. Тогда return self.sources в addFiles() не понадобится.

+0

Спасибо большое, я понимаю лучше. – user3046026

+0

@ user3046026 Не могли бы вы [принять] (http://stackoverflow.com/help/accepted-answer) мой ответ. –

1

Для того, чтобы добавить файлы в listwidget, метод addFiles должен выглядеть следующим образом:

def addFiles(self): 
    files = QtGui.QFileDialog.getOpenFileNames(
     self, "Open File", dirpath, "txt Files (*.txt)") 
    for string in files: 
     self.FileList.addItem(string) 

source список выглядит, как это может быть излишним. Если вам нужно получить полный список файлов, вы можете сделать что-то вроде этого:

sources = [] 
    for row in range(self.FileList.count()): 
     item = self.FileList.item(row) 
     # python3 
     sources.append(item.text()) 
     # python2, convert to python strings 
     # sources.append(unicode(item.text())) 
    print(sources) 
+0

Большое спасибо, это помогает мне понять. – user3046026

Смежные вопросы