首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PyQt使父图形用户界面等待到子图形用户界面关闭

PyQt使父图形用户界面等待到子图形用户界面关闭
EN

Stack Overflow用户
提问于 2016-02-18 19:50:50
回答 1查看 1.5K关注 0票数 1

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

代码:

代码语言:javascript
复制
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()

单击"Test“按钮后,将弹出一个子GUI。我不希望在关闭子GUI之前打印"Child GUI Closed“语句。有人能建议我如何实现这个功能吗?

EN

回答 1

Stack Overflow用户

发布于 2016-02-18 20:14:00

当窗口要关闭时,您必须处理closeEvent来执行操作,而且由于您的Child类继承自QWidget,这意味着它本身就是一个QWidget,因此您不需要使用self.swwidget创建另一个

代码语言:javascript
复制
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()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35480688

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档