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

Вы пытались дебютировать, чтобы проверить значение '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, последнее окно openned.

В 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) 
+0

Это хорошо работает. Но я не знаю, почему ... Я понимаю, что в моем примере ссылка на предыдущее окно потеряна, а в твоем - нет. Но я не понимаю, почему этого достаточно. С помощью этого кода у меня теперь есть ссылка на созданные мной окна, но как Python знает, что щелкнуло конкретное окно без какого-либо «обнаружения щелчка мыши»? –

+0

Фактически существует «обнаружение щелчка мыши». Как бы GUI знал, что вы нажали кнопку, а не на пустом месте? Это просто более низкий уровень. – Mel

Смежные вопросы