PyQt4

时间:2015-11-30 15:42:50

标签: python pyqt4

我最近一直在努力解决问题而且我无法绕过它。我有一个包含子窗口的PyQt QMainWindow

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()  

我确信这个问题在某种程度上是一个经典的伎俩,但尽管现在已经搜索了一段时间,但我无法弄明白。 谢谢你的帮助!

1 个答案:

答案 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_wins中,您拨打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)