[英]Add widget (QCheckBox) to QFileDialog in PyQt5 (Python) not working
我想將 QCheckBox 添加到 QFileDialog。 我想使用靜態方法 QFileDialog.getSaveFileName() 來顯示對話框。
我發現了幾個類似的問題,都在 C++ 中:
我盡力將這些討論翻譯成 python,但還沒有找到解決方案。 我的代碼運行,但復選框不顯示,即使我使用 QFileDialog.DontUseNativeDialog。
這就是我對 QFileDialog 進行子類化的方式:
from PyQt5.QtWidgets import QFileDialog
from PyQt5.QtWidgets import QCheckBox
class ChkBxFileDialog(QFileDialog):
def __init__(self, chkBxTitle=""):
super().__init__()
self.setOption(QFileDialog.DontUseNativeDialog)
chkBx = QCheckBox(chkBxTitle)
self.layout().addWidget(chkBx)
#end __init__
#end ChkBxFileDialog
我以兩種方式運行它。
選項 1(帶有額外的 QFileDialog.DontUseNativeDialog):
import sys
from PyQt5.QtWidgets import QApplication
if __name__ == "__main__":
app = QApplication(sys.argv)
fileDialog = ChkBxFileDialog(chkBxTitle="Chkbx")
fileName = fileDialog.getSaveFileName(filter='*.txt', initialFilter='*.txt',
options=QFileDialog.DontUseNativeDialog)[0]
sys.exit(app.exec_())
選項 2(沒有額外的 QFileDialog.DontUseNativeDialog):
import sys
from PyQt5.QtWidgets import QApplication
if __name__ == "__main__":
app = QApplication(sys.argv)
fileDialog = ChkBxFileDialog(chkBxTitle="Chkbx")
fileName = fileDialog.getSaveFileName(filter='*.txt', initialFilter='*.txt')[0]
sys.exit(app.exec_())
該復選框不會與任一選項一起顯示。 選項 1 使用不同的窗口樣式。 選項 2 顯示了典型的 PyQt QFileDialog。
有誰知道我錯過了什么?
問題在於 getSaveFileName 是一個靜態方法,因此它們不從 ChkBxFileDialog 繼承,因此沒有自定義行為。
有2個選項:
不要使用 getSaveFileName 而是直接使用 QFileDialog 實現邏輯:
import sys from PyQt5.QtWidgets import QApplication, QCheckBox, QDialog, QFileDialog class ChkBxFileDialog(QFileDialog): def __init__(self, chkBxTitle="", filter="*.txt"): super().__init__(filter=filter) self.setSupportedSchemes(["file"]) self.setOption(QFileDialog.DontUseNativeDialog) self.setAcceptMode(QFileDialog.AcceptSave) self.selectNameFilter("*.txt") chkBx = QCheckBox(chkBxTitle) self.layout().addWidget(chkBx) def main(): app = QApplication(sys.argv) dialog = ChkBxFileDialog() if dialog.exec_() == QDialog.Accepted: filename = dialog.selectedUrls()[0].toLocalFile() print(filename) if __name__ == "__main__": main()
使用一些技巧來獲取QFileDialog 實例,例如獲取所有topLevels 並驗證它是一個QFileDialog。
import sys from functools import partial from PyQt5.QtCore import QTimer from PyQt5.QtWidgets import QApplication, QCheckBox, QDialog, QFileDialog def add_checkbox(chkBxTitle): for tl in QApplication.topLevelWidgets(): if isinstance(tl, QFileDialog): tl.setOption(QFileDialog.DontUseNativeDialog) chkBx = QCheckBox(chkBxTitle) tl.layout().addWidget(chkBx) def main(): app = QApplication(sys.argv) QTimer.singleShot(1000, partial(add_checkbox, "")) fileName, _ = QFileDialog.getSaveFileName( filter="*.txt", initialFilter="*.txt", options=QFileDialog.DontUseNativeDialog ) if __name__ == "__main__": main()
我想使用靜態方法
QFileDialog.getSaveFileName()
來顯示對話框
那是不可能的。 C++ 代碼中定義的靜態方法對您的派生類一無所知,因此它將創建基類的一個實例,其中不包含您的修改。 您必須顯式實例化您的派生類,在實例上調用exec()
,檢查返回代碼並可能調用其selectedFiles()
方法以查看選擇了哪些文件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.