6

pyqtを使って簡単なコードを書いています

コードでは、を呼び出しますがQFileDialog、静的関数を使用して呼び出すと、すべて正常に機能しますが、通常の方法、つまりを使用dialog.exec_(),すると、ファイルダイアログウィンドウにファイルが表示されません。

ファイルの完全なパスを入力して初めて、ファイルダイアログウィンドウにファイルが表示されます。この問題は、FileDialoghandler関数を呼び出した場合にのみ発生することに注意してください。そうしないと、どのように呼び出してもQFileDialog、すべてが正常に機能します。また、この問題はLinuxでのみ発生し、Windows7ではすべて問題なく動作します。これがPyQtのバグなのか、それともここで何かが足りないのか疑問に思っています。

コードは次のとおりです。

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()
4

2 に答える 2

10

少し前に getOpenFilename で同様の問題が発生しました。私にとっての解決策は、バックエンドをネイティブから Qt 独自のダイアログの実装に変更することでした。これは、次のような拡張呼び出し構文で実現できます。

filename = QtGui.QFileDialog.getOpenFileName(self,
                                             'Open file',
                                             '/home',
                                             'All files (*.*)',
                                             options=QtGui.QFileDialog.DontUseNativeDialog)

この呼び出し構文に変更した後、問題が発生することはありませんでした。

于 2012-09-13T12:37:55.327 に答える