piszę prostego kodu przy użyciu PyQtżadne pliki widoczne w oknie QFileDialog
W kodzie, I wywołać QFileDialog
, jednak kiedy ją wywołać za pomocą statycznych funkcji wszystko działa poprawnie, ale z normalną metodą IE używając dialog.exec_(),
Nie widzę żadnych plików w oknie dialogowym pliku.
Dopiero po wpisaniu pełnej ścieżki pliku mogę zobaczyć plik w oknie dialogowym pliku. Zauważ, że ten problem występuje tylko wtedy, gdy wywołuję funkcję FileDialoghandler
. Jeśli tego nie zrobię, niezależnie od tego, jak wywołuję funkcję QFileDialog
, wszystko działa poprawnie. A także ten problem dotyczy tylko systemu Linux, na Windows7 wszystko działa poprawnie. Zastanawiam się, czy jest to błąd PyQt, czy też coś tu brakuje?
Kod jest następujący:
import sys
from PyQt4.QtCore import Qt
from PyQt4.QtGui import *
from PyQt4.QtCore import QAbstractFileEngine
from PyQt4.QtCore import QAbstractFileEngineHandler
from PyQt4.QtCore import QFSFileEngine
class FileDialogHandler(QAbstractFileEngineHandler):
def create(self,filename):
if str(filename).startswith(':'):
return None # Will be handled by Qt as a resource file
print("Create QFSFileEngine for {0}".format(filename))
return QFSFileEngine(filename)
class Example(QMainWindow):
def __init__(self):
super(Example, self).__init__()
self.initUI()
def initUI(self):
self.textEdit = QTextEdit()
self.setCentralWidget(self.textEdit)
self.statusBar()
openFile = QAction(QIcon('open.png'), 'Open', self)
openFile.setShortcut('Ctrl+O')
openFile.setStatusTip('Open new File')
openFile.triggered.connect(self.showDialog)
menubar = self.menuBar()
fileMenu = menubar.addMenu('&File')
fileMenu.addAction(openFile)
self.setGeometry(300, 300, 350, 300)
self.setWindowTitle('File dialog')
self.show()
def showDialog(self):
handler = FileDialogHandler()
#using QFileDialog.getOpenFileName works fine
fname = QFileDialog.getOpenFileName(None, 'Open file', '/home','All files (*.*)')
#dialog = QFileDialog()
#dialog.setOption(QFileDialog.DontUseNativeDialog,False)
#if dialog.exec_():
#fname = dialog.selectedFiles()
#else:
#fname = None
f = open(fname, 'r')
with f:
data = f.read()
self.textEdit.setText(data)
def main():
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
Potwierdzono, że nie działa dla mnie w systemie Linux. Jednak ten sam kod działa z PySide - więc prawdopodobnie jest to błąd PyQt. Proponuję, abyś zgłosił to na [liście dyskusyjnej PyQt] (http://www.riverbankcomputing.com/mailman/listinfo/pyqt), aby uzyskać ostateczną odpowiedź. – ekhumoro
Wydaje się działać na OS X. Dlaczego naprawdę potrzebujesz 'QFSFileEngine'? –
Uważaj z 'f = open (fname, 'r'); z f'. Nie tylko możesz umieścić dwie instrukcje w jednym 'z otwartym (fname, 'r') jako f', ale powinieneś przede wszystkim enkapsulować go w' try ... except 'z wyjątkiem IOError', aby nie upaść jeśli użytkownik naciśnie "Anuluj" (tj., gdy 'fname =" "') –