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()
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
Dường như làm việc trên OS X. Tại sao bạn thực sự cần một 'QFSFileEngine'? –
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 =" "') –