簡體   English   中英

將小部件(QCheckBox)添加到 PyQt5(Python)中的 QFileDialog 不起作用

[英]Add widget (QCheckBox) to QFileDialog in PyQt5 (Python) not working

我想將 QCheckBox 添加到 QFileDialog。 我想使用靜態方法 QFileDialog.getSaveFileName() 來顯示對話框。

我發現了幾個類似的問題,都在 C++ 中:

  1. 如何在 QT3 的 QFileDialog 窗口中添加復選框?
  2. 在 QFileDialog 中添加小部件
  3. https://www.qtcentre.org/threads/42858-Creating-a-Custom-FileOpen-Dialog
  4. https://forum.qt.io/topic/103964/add-checkbox-to-qfiledialog/7

我盡力將這些討論翻譯成 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM