简体   繁体   中英

Pyqt5 QMDIarea subclass with a custom signal on close

I need to create a custom signal on Qmdisubwindow close. In other word, when I closed any subwindow, a signal is emitted with the name of that window being closed. Below is my trail, but seems not right. Error occurs as:

  1. a subwindow already created without calling
  2. add subwindow option is not working
  3. closable action is not working

Hope you can show me how to fix it.

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *


class MyMdi(QMdiSubWindow):

   sigClosed = pyqtSignal(str)

   def __init__(self, parent=None):
      super(MyMdi, self).__init__(parent)
      

   def closeEvent(self, event):
      """Get the name of active window about to close
      """
      name = name
      self.sigClosed.emit('{} is close'.format(name))
      QMdiSubWindow.closeEvent(self, event)



class MainWindow(QMainWindow):
   count = 0
    
   def __init__(self, parent = None):
      super(MainWindow, self).__init__(parent)
      
      self.mdi = MyMdi()
      self.setCentralWidget(self.mdi)
      bar = self.menuBar()
        
      file = bar.addMenu("File")
      file.addAction("New")
      file.triggered[QAction].connect(self.windowaction)
      self.setWindowTitle("MDI demo")

      # my signal
      self.mdi.sigClosed.connect(self.windowclosed)

   @pyqtSlot(str)
   def windowclosed(self, text):
      print(text)

        
   def windowaction(self, q):
        
      if q.text() == "New":
         MainWindow.count = MainWindow.count+1
         sub = QMdiSubWindow()
         sub.setWidget(QTextEdit())
         sub.setWindowTitle("subwindow"+str(MainWindow.count))
         self.mdi.addSubWindow(sub)
         sub.show()
        
def main():
   app = QApplication(sys.argv)
   ex = MainWindow()
   ex.show()
   sys.exit(app.exec_())
    
if __name__ == '__main__':
   main()

You have an initial error: a QMdiSubWindow must be inside a QMdiArea but there is none in your code.

On the other hand, the idea of subclassing is good but you have several drawbacks:

  • You are not using it initially since there is no QMdiArea, if you execute the QAction then your application will be closed because a QMdiSubWindow does not have any method called addSubWindow.

  • The QMdiSubWindow does not have an attribute called name, you must use windowTitle.

class MdiSubWindow(QMdiSubWindow):
    sigClosed = pyqtSignal(str)

    def closeEvent(self, event):
        """Get the name of active window about to close
      """
        self.sigClosed.emit()
        QMdiSubWindow.closeEvent(self, event)


class MainWindow(QMainWindow):
    count = 0

    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)

        
        self.setCentralWidget(self.mdi)
        bar = self.menuBar()

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

    @pyqtSlot(str)
    def windowclosed(self, text):
        print(text)

    def windowaction(self, q):
        if q.text() == "New":
            MainWindow.count = MainWindow.count + 1
            
            sub.setWidget(QTextEdit())
            
            sub.setWindowTitle("subwindow" + str(MainWindow.count))
            
            self.mdi.addSubWindow(sub)
            sub.show()

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM