2017-06-11 3 views
0

dans le code exécutable suivant, vous pouvez créer plus sous-fenêtre. Mais, quand je passe d'une sous-fenêtre à l'autre, je veux que le programme détecte quelle sous-fenêtre est active. Image, nous avons opend deux sous-fenêtre. Une sous-fenêtre nous l'appelons A et l'autre sous-fenêtre nous l'appelons B. Les deux sont déjà ouverts. Subwindow A ist active, maintenant je passe à Subwindow B. Comment la classe Custom_Window() peut-elle me dire "Je suis ici et je suis actuellement actif" ?.Sous-fenêtre PyQt4 dans MDI. Vérifiez quelle sous-fenêtre est active

MISE À JOUR

import sys 
from PyQt4.QtCore import * 
from PyQt4.QtGui import * 

class Custom_Window(QWidget) : 
    def __init__(self, parent = None) : 
     super(Custom_Window, self) .__init__(parent) 

     # print here in this class, that itself is currently active, 
     # because this window is a subwindow, so its inherits from class 
     # QMdiSubWindow(). I want this subwindow itself tell me 
     # whether its activated or not. BUT I don't know how to 
     # solve this idea. 

    def changeEvent(self, event): 

     print "event", event 
     print "type", type(self.parent()) 
     print "Status", self.parent().isActiveWindow() 

     if event.type() == QEvent.WindowActivate: 
     if self.parent().isActiveWindow(): 
      print "is currently active." 
     else: print "I am passive" 

class MainWindow(QMainWindow) : 
    count = 0 

    def __init__(self, parent = None) : 
     super(MainWindow, self) .__init__(parent) 
     self.mdi = QMdiArea() 
     self.setCentralWidget(self.mdi) 
     bar = self.menuBar() 

     file = bar.addMenu("File") 
     file.addAction("New") 
     file.addAction("cascade") 
     file.addAction("Tiled") 
     file.triggered[QAction].connect(self.windowaction) 
     self.setWindowTitle("MDI demo") 

    def windowaction(self, q) : 
     custom_window = Custom_Window() 
     print "triggered" 

     if q.text() == "New" : 
      MainWindow.count = MainWindow.count+1 
      sub = QMdiSubWindow() 
      sub.setWidget(Custom_Window()) 
      sub.setWindowTitle("subwindow"+str(MainWindow.count)) 
      self.mdi.addSubWindow(sub) 
      sub.show() 

     if q.text() == "cascade" : 
      self.mdi.cascadeSubWindows() 

     if q.text() == "Tiled" : 
      self.mdi.tileSubWindows() 

def main() : 
    app = QApplication(sys.argv) 
    ex = MainWindow() 
    ex.show() 
    sys.exit(app.exec_()) 

if __name__ == '__main__': 
    main() 
+0

Est-ce que vous regardez la documentation de Qt? Il existe plusieurs API très évidentes pour faire ce genre de chose. – ekhumoro

+0

Hey ekhumoro, je n'ai pas trouvé quelque chose. – Sophus

+0

Donc, vous ne voyez rien [ici] (https://doc.qt.io/qt-4.8/qmdiarea.html#public-functions), ou [ici] (https://doc.qt.io/ qt-4.8/qmdiarea.html # fonctions-publiques)? Si ceux-ci ne font pas ce que vous voulez, vous devez expliquer beaucoup plus clairement ce que vous essayez d'accomplir. – ekhumoro

Répondre

1

Les docs Qt pour QMdiArea vous montrer les API à utiliser. Il y a un signal subWindowActivated qui est conçu à cet effet, donc il suffit de connecter une fente à elle:

class Custom_Window(QWidget) : 

    def handleActivationChange(self, subwindow): 
     if subwindow is self.parent(): 
      print 'activated:', self 
     else: 
      print 'deactivated:', self 

... 

     self.mdi.subWindowActivated.connect(
      sub.widget().handleActivationChange)