[英]PyQt5 QFileDialog closes when filename clicked
我正在使用PyQt5 QFileDialog.getOpenFileName
。 我希望該框保持打開狀態,直到單擊“打開”按鈕。 但是,當我在我的 Linux 系統上運行代碼時,單擊文件名時對話框會立即關閉。 在 Windows 系統上,該框的行為與預期一樣,並保持打開狀態,直到單擊“打開”按鈕。 無論是否設置了QFileDialog.DontUseNativeDialog
選項,結果都相同。
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QFileDialog
import sys
class Main(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("QFileDialog Test")
button = QPushButton("Click to open file")
button.setCheckable(True)
button.clicked.connect(self.open_file)
# Set the central widget of the Window.
self.setCentralWidget(button)
def open_file(self):
options = QFileDialog.Options()
options |= QFileDialog.DontUseNativeDialog
file_name, _ = QFileDialog.getOpenFileName(None, "Open File",
"", "Python Files (*.py);;Text Files (*.txt)",options=options)
app = QApplication(sys.argv)
window = Main()
window.show()
app.exec_()
編輯:我退出 KDE 並啟動了 Openbox session,然后運行上述代碼。 QFileDialog 的行為與我預期的一樣,並等待我單擊“打開”按鈕。 這驗證了 KDE / KWin 存在問題,並且在其他 window 管理器下運行的代碼可能會正常工作。
仍然不是一個真正的解決方案,但我現在比以前更了解情況。
第二次編輯:我發現如果我將工作區行為 -> 常規行為 -> 單擊行為從單擊更改為雙擊,我的 QFileDialog 問題就會消失。 但是,如何解決這個問題將是一個不同的話題。
第三次編輯:在示例代碼中添加了“QFileDialog.DontUseNativeDialog”選項。
似乎 Qt 試圖尊重操作系統在其文件管理器中打開文件和文件夾的方式,即使在使用本機對話框時也是如此。 這取決於SH_ItemView_ActivateItemOnSingleClick
樣式提示,繞過它的唯一方法是應用代理樣式。
雖然您可以在其__init__
中將樣式應用於 QFileDialog 的視圖(只要您使用本機對話框),但您使用的是 static 方法,因此您只能通過將樣式設置為整個 QApplication 來做到這一點。
請注意,與樣式表、調色板和字體不同,styles 不會傳播到子小部件,它們始終使用 QApplication 樣式(或為它們手動設置的樣式)。
class SingleClickWorkaroundProxy(QProxyStyle):
def styleHint(self, hint, option, widget, data):
if hint == self.SH_ItemView_ActivateItemOnSingleClick:
return False
return super().styleHint(hint, option, widget, data)
# ...
app = QApplication(sys.argv)
app.setStyle(SingleClickWorkaroundProxy())
window = Main()
window.show()
app.exec_()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.