【问题标题】:PyQt Make parent GUI wait till child GUI is closedPyQt 让父 GUI 等到子 GUI 关闭
【发布时间】:2016-02-18 11:50:50
【问题描述】:

我是 pyqt 的新手。我试图在父 GUI 中单击按钮时调用子 GUI。在此过程中,父 GUI 必须等待用户在选择了一些输入后关闭子 GUI。但这并没有发生,父 GUI 确实执行了调用子 GUI 之后的下一行。下面是我将参数从父 GUI 传递给子 GUI 的代码。子 GUI 将根据 OK/Cancel 按钮单击返回值

代码:

import sys
from PyQt4 import QtGui,QtCore,Qt
from PyQt4.QtCore import *
from PyQt4.QtGui import *

class Child(QtGui.QWidget):
  def __init__(self,switches=None):
    super(Child,self).__init__()
    self.swwidget = QtGui.QWidget()
    self.swlayout = QtGui.QGridLayout()
    switches = ['abc1','def1']
    switches.sort()
    self.switches = switches

  def switchesUI(self):
    self.swwidget.setWindowModality(QtCore.Qt.ApplicationModal)
    self.swl   = len(self.switches)
    self.sw    = {}
    self.addsw = []
    print ("I am in switchesUI")
    #Add the switches to layout dynamically
    for i in range(self.swl):
        self.sw[i] = QtGui.QCheckBox(self.switches[i])
        self.swlayout.addWidget(self.sw[i],i,0)
    self.swbuttonbox = QtGui.QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel);
    self.swbuttonbox.setOrientation(QtCore.Qt.Horizontal)
    self.swlayout.addWidget(self.swbuttonbox)
    self.swwidget.setWindowTitle('Switches')
    self.swwidget.setLayout(self.swlayout)
    self.swwidget.show()
    self.connect(self.swbuttonbox,QtCore.SIGNAL("accepted()"),self.swaccept)
    self.connect(self.swbuttonbox,QtCore.SIGNAL("rejected()"),self.swreject)

  def swaccept(self):
    for i in range(self.swl):
      if self.sw[i].isChecked():
         self.addsw.append(self.switches[i])
    self.swwidget.close()
    return self.addsw

  def swreject(self):
    self.swwidget.close()
    return None

class Parent(QtGui.QWidget):
  def __init__(self):
    super(Parent,self).__init__()
    QtGui.QWidget.__init__(self)
    self.button = QtGui.QPushButton('Test', self)
    self.layout = QtGui.QVBoxLayout(self)
    self.layout.addWidget(self.button)
    self.assw = ['Test1','Test2']
    self.CH = Child(self.assw)
    self.connect(self.button,SIGNAL("clicked()"),self.popup)
    print ("Child GUI closed")

  def popup(self):
    self.CH.switchesUI()

def main():
  app = QtGui.QApplication(sys.argv)
  form = Parent()
  form.show()
  sys.exit(app.exec_())

if __name__ == '__main__':
  main()

点击“测试”按钮后,会弹出一个子图形用户界面。在子 GUI 关闭之前,我不希望打印“Child GUI Closed”语句。 有人可以建议我如何实现此功能吗?

【问题讨论】:

    标签: python python-3.x pyqt pyqt4


    【解决方案1】:

    当窗口想要关闭时,您必须处理 closeEvent 才能执行操作,因为您的 Child 类继承自 QWidget,这意味着它本身就是 QWidget,您不需要使用 @987654325 创建另一个@

    import sys
    from PyQt4 import QtGui,QtCore,Qt
    from PyQt4.QtCore import *
    from PyQt4.QtGui import *
    
    class Child(QtGui.QWidget):
      def __init__(self,switches=None):
        super(Child,self).__init__()
        # self.swwidget = QtGui.QWidget() # you don't need to do this you can add all the properties to self
        self.swlayout = QtGui.QGridLayout()
        switches = ['abc1','def1']
        switches.sort()
        self.switches = switches
    
      def switchesUI(self):
        self.setWindowModality(QtCore.Qt.ApplicationModal)
        self.swl   = len(self.switches)
        self.sw    = {}
        self.addsw = []
        print ("I am in switchesUI")
        #Add the switches to layout dynamically
        for i in range(self.swl):
            self.sw[i] = QtGui.QCheckBox(self.switches[i])
            self.swlayout.addWidget(self.sw[i],i,0)
        self.swbuttonbox = QtGui.QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel);
        self.swbuttonbox.setOrientation(QtCore.Qt.Horizontal)
        self.swlayout.addWidget(self.swbuttonbox)
        self.setWindowTitle('Switches')
        self.setLayout(self.swlayout)
        self.show()
        self.connect(self.swbuttonbox,QtCore.SIGNAL("accepted()"),self.swaccept)
        self.connect(self.swbuttonbox,QtCore.SIGNAL("rejected()"),self.swreject)
    
      def swaccept(self):
        for i in range(self.swl):
          if self.sw[i].isChecked():
             self.addsw.append(self.switches[i])
        self.close()
        return self.addsw
    
      def swreject(self):
        self.close()
        return None
    
      def closeEvent(self, event):
          print ("Child GUI closed")
    
    class Parent(QtGui.QWidget):
      def __init__(self):
        super(Parent,self).__init__()
        QtGui.QWidget.__init__(self)
        self.button = QtGui.QPushButton('Test', self)
        self.layout = QtGui.QVBoxLayout(self)
        self.layout.addWidget(self.button)
        self.assw = ['Test1','Test2']
        self.CH = Child(self.assw)
        self.connect(self.button,SIGNAL("clicked()"),self.popup)
    
      def popup(self):
        self.CH.switchesUI()
    
    
    def main():
      app = QtGui.QApplication(sys.argv)
      form = Parent()
      form.show()
      sys.exit(app.exec_())
    
    if __name__ == '__main__':
      main()
    

    【讨论】:

    • 嗨 danidee,感谢您的回复。我在这里有一个问题:我应该怎么做才能让父 GUI 等到子 GUI 返回一个值?我的意思是,如果我在 self.CH.switchesUI() 行之后在父 GUI 中放置一个打印语句,我的父母应该只在子 GUI 关闭后打印它。我怎样才能做到这一点?
    • 这是self.CH.switchesUI() 之后的下一条语句将被执行时的默认行为,您到底想实现什么...您现在通过阻止MainWindow 来尝试做什么可能会阻塞主线程并使您的 UI 无响应
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-02
    • 2018-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多