2015-11-30 45 views
2

最近我一直在努力解决问题,我无法绕过它。我有一个PyQt的QMainWindow其中包含一个子窗口:PyQt4中的不活动子窗口

enter image description here

正如你可以计算出,点击GO!按钮将打开一个数由数量在QLineEdit指定的子窗口:

enter image description here

并点击QCheckBox每个子窗口中应显示文本。

问题是,这只适用于最后衍生的子窗口。其他人似乎不活跃。 他们是一种让他们活跃的方式吗?

请在下面找到我的代码:

from PyQt4 import QtGui 
import mainWin 
import subWin 
import sys 

class MainWindowGui(): 
    def __init__(self): 
     self.w = QtGui.QMainWindow() 
     self.MainWindow = myWinCls(self) 
     self.MainWindow.setupUi(self.w) 
     self.w.showMaximized() 

class myWinCls(QtGui.QMainWindow): 
    def __init__(self, parent = None): 
     QtGui.QWidget.__init__(self) 
     self.parent = parent 

    def setupUi(self,Widget): 
     self.ui = mainWin.Ui_MainWindow() 
     self.ui.setupUi(Widget) 
     self.ui.mdiArea.addSubWindow(self.ui.subwindow) 
     self.ui.goBtn.clicked.connect(self.show_wins) 

    def show_wins(self): 
     N = int(self.ui.nbrEdit.text()) 
     for self.k in xrange(N): 
      self.show_subwins() 

    def show_subwins(self): 
     self.win = QtGui.QWidget() 
     self.child_window = showSubWinCls(self) 
     self.child_window.setupUi(self.win) 
     self.subwin = self.ui.mdiArea.addSubWindow(self.win) 
     self.win.setWindowTitle("Subwin " + str(self.k)) 
     self.subwin.show() 

class showSubWinCls(QtGui.QWidget): 
    def __init__(self, parent = None): 
     QtGui.QWidget.__init__(self) 
     self.parent = parent 

    def setupUi(self, Widget): 
     self.ui = subWin.Ui_Form() 
     self.ui.setupUi(Widget) 
     self.ui.checkBox.clicked.connect(self.show_msg) 

    def show_msg(self): 
     if self.ui.checkBox.isChecked(): 
      self.ui.lineEdit.setText("Yiiiiiihaaaaaa !!!") 
     else: 
      self.ui.lineEdit.setText("") 

def main(): 
    app = QtGui.QApplication(sys.argv) 
    app.setStyle(QtGui.QStyleFactory.create('WindowsVista')) 
    ex = MainWindowGui() 
    sys.exit(app.exec_()) 

if __name__ == '__main__': 
    main() 

我相信这个问题是某种经典的伎俩,但现在,尽管搜索了一段时间,我无法弄清楚。 感谢您的帮助!

+0

你试过debbug检查'self.ui.checkBox.isChecked'的值为每个子窗口? – MaTh

+0

是的。从这个角度来看没问题... –

+0

有人在几分钟前添加了答案并将其删除。太糟糕的原因提出的解决方案似乎工作... –

回答

1

有问题的部分:

def show_wins(self): 
    N = int(self.ui.nbrEdit.text()) 
    for self.k in xrange(N): 
     self.show_subwins() 

def show_subwins(self): 
    self.win = QtGui.QWidget() 
    self.child_window = showSubWinCls(self) #erase refererence to previous one 
    self.child_window.setupUi(self.win) 
    self.subwin = self.ui.mdiArea.addSubWindow(self.win) 
    self.win.setWindowTitle("Subwin " + str(self.k)) 
    self.subwin.show() 

你只保留引用一个子窗口中self.child_window,最后一个窗口公开。您可以拨打show_subwin N时间。每次您将self.child_window重新定义为showSubWinCls类的新实例。你失去了对前一个的引用。

您需要保留对所有窗口的引用,否则信号和插槽将不起作用。你可以这样做:

class myWinCls(QtGui.QMainWindow): 
    def __init__(self, parent = None): 
     QtGui.QWidget.__init__(self) 
     self.parent = parent 
     self.subWindowList=[] 

    def show_subwins(self): 
     ... 
     child_window = showSubWinCls(self) 
     child_window.setupUi(self.win) 
     self.subWindowList.append(child_window) 
+0

这效果很好。但我不知道为什么...我明白,在我的例子中,对前一个窗口的引用丢失了,在你的代码中没有。但我不明白为什么添加这个就足够了。通过这段代码,我现在可以参考我创建的窗口,但Python如何知道点击了特定的窗口,而没有任何“鼠标点击检测”? –

+0

实际上有“鼠标点击检测”。图形用户界面如何知道你点击了一个按钮,而不是空的空间?它只是更低级的。 – Mel