【问题标题】:show Qwidget window without MainWindow显示没有 MainWindow 的 Qwidget 窗口
【发布时间】:2015-11-05 09:10:19
【问题描述】:

我在显示 QWidget 窗口以供用户输入一些数据时遇到问题。

我的脚本没有 GUI,但我只想显示这个 QWidget 小窗口。

我用 QtDesigner 创建了窗口,现在我尝试像这样显示 QWidget 窗口:

from PyQt4 import QtGui
from input_data_window import Ui_Form

class childInputData(QtGui.QWidget ):

    def __init__(self, parent=None):
        super(childInputData, self).__init__()
        self.ui = Ui_Form()
        self.ui.setupUi(self)
        self.setFocus(True)
        self.show()

然后,在我的主要课程中,我正在这样做:

class myMainClass():

    childWindow = childInputData()

这给了我错误:

QWidget: Must construct a QApplication before a QPaintDevice

所以现在我正在做,从我的主课开始:

class myMainClass():

    app = QtGui.QApplication(sys.argv)
    childWindow = childInputData() 

现在没有错误,但是窗口显示了两次,脚本没有等到输入数据,它只是显示窗口并继续而不等待。

这里有什么问题?

【问题讨论】:

  • 关于窗口显示两次,我在您发布的代码中看不到原因。你确定你没有在代码中的其他地方调用show() 吗?
  • 是的,我是:S .....我的错

标签: python pyqt qwidget


【解决方案1】:

显示窗口并且脚本继续运行是完全正常的:您从未告诉脚本等待用户回答。你只是告诉它显示一个窗口。

您希望脚本在用户完成操作并关闭窗口之前停止。

这是一种方法:

from PyQt4 import QtGui,QtCore
import sys

class childInputData(QtGui.QWidget):

    def __init__(self, parent=None):
        super(childInputData, self).__init__()
        self.show()

class mainClass():

    def __init__(self):
        app=QtGui.QApplication(sys.argv)
        win=childInputData()
        print("this will print even if the window is not closed")
        app.exec_()
        print("this will be print after the window is closed")

if __name__ == "__main__":
    m=mainClass()

exec() 方法“进入主事件循环并等待直到调用 exit()”(doc):
该脚本将在app.exec_() 行被阻止,直到窗口关闭。

注意:使用sys.exit(app.exec_()) 会导致脚本在窗口关闭时结束。


另一种方法是使用QDialog 而不是QWidget。然后将self.show() 替换为self.exec(),这将阻止脚本

来自doc

int QDialog::exec()

将对话框显示为模态对话框,在用户关闭之前一直阻塞


最后,一个相关问题的this answer主张不要使用exec,而是用win.setWindowModality(QtCore.Qt.ApplicationModal)设置窗口模态。但是这在这里不起作用:它会阻止其他窗口中的输入,但不会阻止脚本。

【讨论】:

  • 感谢这正是我正在寻找的行为
  • 没有。两个页面都将在 qwidget 案例中打开。也许你在 qdialog 案例上是对的
【解决方案2】:

你不需要myMainClass...做这样的事情:

import sys
from PyQt4 import QtGui
from input_data_window import Ui_Form

class childInputData(QtGui.QWidget):
  def __init__(self, parent=None):
    super(childInputData, self).__init__(parent)
    self.ui = Ui_Form()
    self.ui.setupUi(self)
    self.setFocus(True)

if __name__ == "__main__":
 app = QtGui.QApplication(sys.argv)
 win = childInputData()
 win.show()
 sys.exit(app.exec_())

【讨论】:

  • 感谢 jramm,我知道我可以做到,我实际上一直在做我的 GUI,但是在我的问题中,我的意思是我想从我的班级中显示小部件窗口,即不可能?
  • 我不明白为什么如果你将win.show() 移到类的__init__ 方法中它会不起作用......但它有什么不同呢?
  • 再次感谢,没有区别,只是想知道是否可以
猜你喜欢
  • 2022-01-19
  • 1970-01-01
  • 2012-03-12
  • 1970-01-01
  • 2019-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多