我在这个简单的代码行中遇到了奇怪的行为,我想在pyqt GUI类之外使用
from PyQt4 import QtGui
FilePath=QtGui.QFileDialog.getOpenFileName(None,'choose the file')
当我第一次实现它时,它工作(可能是因为我之前运行了一些其他代码,我无法追溯)。
然后在重新启动python后,它停止工作并崩溃说:
QWidget:必须在QPaintDevice之前构建QApplication
在GUI中实现时,完全相同的代码可以正常工作,其中第一个参数当然是self
。
但是我想在GUI环境之外的一个外部函数中使用相同的filedialog用于不同的目的。
是否有可能以及实现这一点的方式/解决方法?我想避免使用wx,easygui或tk
答案 0 :(得分:0)
要使用Qt UI元素(例如QFileDialog
),您通常必须运行QApplication
。它看起来有点不正统,但你可以通过在QApplication
之前实例化QFileDialog
来让你的代码段运行,就像这样
from PyQt4 import QtGui
app = QtGui.QApplication([])
FilePath=QtGui.QFileDialog.getOpenFileName(None,'choose the file')
从技术上讲,这可行,但我不太确定我可以支持这样做。
答案 1 :(得分:0)
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中包含许多示例,请检查它们。