2012-08-31 19 views
6

Tôi viết một mã đơn giản sử dụng PyQtKhông tập tin có thể nhìn thấy trong cửa sổ QFileDialog

Trong đoạn mã, tôi gọi một QFileDialog, tuy nhiên khi tôi gọi nó bằng cách sử dụng chức năng tĩnh tất cả hoạt động tốt, nhưng với phương pháp tức là bình thường sử dụng dialog.exec_(), Tôi không thấy bất kỳ tệp nào trong cửa sổ hộp thoại tệp.

Chỉ sau khi nhập đường dẫn đầy đủ của tệp, tôi mới có thể xem tệp trong cửa sổ hộp thoại tệp. Lưu ý rằng vấn đề này chỉ xảy ra khi tôi gọi hàm FileDialoghandler, Nếu tôi không làm điều đó, bất kể cách tôi gọi QFileDialog, mọi thứ đều hoạt động tốt. Và vấn đề này cũng chỉ có trên Linux, trên Windows7 mọi thứ hoạt động tốt. Tôi tự hỏi liệu đây có phải là lỗi PyQt hay tôi đang thiếu thứ gì đó ở đây?

Mã là như sau:

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() 
+0

Xác nhận rằng nó không hoạt động đối với tôi trên Linux. Tuy nhiên, cùng một mã không hoạt động với PySide - vì vậy nó có thể là một lỗi PyQt. Tôi khuyên bạn nên báo cáo nó trên [danh sách gửi thư PyQt] (http://www.riverbankcomputing.com/mailman/listinfo/pyqt) để có được câu trả lời dứt khoát. – ekhumoro

+0

Dường như làm việc trên OS X. Tại sao bạn thực sự cần một 'QFSFileEngine'? –

+0

Hãy cẩn thận với 'f = open (fname, 'r'); với f'. Không chỉ bạn có thể đặt hai câu lệnh trong một 'với mở (fname, 'r') là f', nhưng bạn nên ở trên tất cả đóng gói nó trong một' try ... ngoại trừ IOError' để bạn không sụp đổ nếu người dùng nhấn 'Hủy' (nghĩa là khi 'fname =" "') –

Trả lời

6

tôi gặp phải một vấn đề tương tự cách đây không lâu với getOpenFilename. Đối với tôi, giải pháp là thay đổi backend từ bản địa sang thực thi của Qt trong hộp thoại. Điều này có thể đạt được với cú pháp gọi mở rộng có dạng như sau:

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

Sau khi tôi đổi sang cú pháp gọi điện này, tôi không bao giờ gặp trở ngại nào nữa.

Các vấn đề liên quan