2015-11-30 76 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