【问题标题】:Can QtGui.QFileDialog.getOpenFileName() be used outside a GUI?QtGui.QFileDialog.getOpenFileName() 可以在 GUI 之外使用吗?
【发布时间】:2015-12-15 15:17:23
【问题描述】:

我在这行简单的代码中遇到了一个奇怪的行为,我想在 pyqt GUI 类之外使用它

from PyQt4 import QtGui

FilePath=QtGui.QFileDialog.getOpenFileName(None,'choose the file')

当我第一次实现它时,它起作用了(可能是因为我之前运行了一些其他代码,我无法追溯)。

然后重新启动python后,它停止工作并崩溃说:

QWidget:必须在 QPaintDevice 之前构造 QApplication

相同的代码在 GUI 中实现时也能正常工作,其中第一个参数当然是 self

但我想在用于不同目的的外部函数中使用相同的文件对话框,在 GUI 上下文之外。

是否有可能以及实现它的方法/解决方法是什么?我想避免使用 wx、easygui 或 tk

【问题讨论】:

    标签: python user-interface pyqt filedialog


    【解决方案1】:

    为了使用 Qt UI 元素(例如QFileDialog),您通常必须运行一个QApplication。这似乎有点不正统,但是您可以通过在 QFileDialog 之前实例化 QApplication 来让您的 sn-p 运行,就像这样

    from PyQt4 import QtGui
    app = QtGui.QApplication([])
    FilePath=QtGui.QFileDialog.getOpenFileName(None,'choose the file')
    

    从技术上讲,这是可行的,但我不太确定我是否支持这样做。

    【讨论】:

    • 感谢JCV的建议,我已经试过了。该解决方案可以自行运行,但是一旦我添加更多代码,它就会严重崩溃..
    【解决方案2】:

    Qt 应用程序是围绕事件循环构建的,并且需要 QApplication 实例。对话框有自己的事件循环,所以如果你想要的只是一个向导(一系列按顺序打开/关闭的对话框),那么原则上你只需要 QApplication 实例。以下适用于 PyQt 5:

    from PyQt5 import Qt
    app = Qt.QApplication([])
    FilePath=Qt.QFileDialog.getOpenFileName(None,'choose the file')
    print(FilePath)
    

    但是,如果您有其他代码假设应用程序事件循环,那么所有的赌注都没有了。在这种情况下,您可以执行以下操作:

    from PyQt4 import Qt
    app = Qt.QApplication([])
    FilePath=Qt.QFileDialog.getOpenFileName(None,'choose the file')
    print(FilePath)
    ...create widgets....
    QTimer.singleShot(someWidgetMethod)
    app.exec_()
    

    单次计时器仅在app.exec_() 期间触发,因此将您的一些代码作为事件循环的一部分调用。

    话虽如此,最好创建一个主窗口并将插槽连接到信号并调用app.exec_()。 PyQt 包含许多示例,请查看这些示例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-10
      • 2014-05-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多