【问题标题】:Pyqt5 QMDIarea subclass with a custom signal on closePyqt5 QMDIarea 子类,关闭时带有自定义信号
【发布时间】:2020-06-21 21:15:21
【问题描述】:

我需要在Qmdisubwindow 关闭时创建一个自定义信号。换句话说,当我关闭任何子窗口时,会发出一个信号,其中包含正在关闭的窗口的名称。下面是我的踪迹,但似乎不对。错误发生为:

  1. 一个子窗口已经创建而无需调用
  2. 添加子窗口选项不起作用
  3. 可关闭的操作不起作用

希望你能告诉我如何解决它。

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

【问题讨论】:

    标签: python pyqt pyqt5


    【解决方案1】:

    您有一个初始错误:QMdiSubWindow 必须在 QMdiArea 内,但您的代码中没有。

    另一方面,子类化的想法很好,但你有几个缺点:

    • 你最初没有使用它,因为没有 QMdiArea,如果你执行 QAction,那么你的应用程序将被关闭,因为 QMdiSubWindow 没有任何名为 addSubWindow 的方法。

    • QMdiSubWindow 没有名为 name 的属性,必须使用 windowTitle。

    class MdiSubWindow(QMdiSubWindow):
        sigClosed = pyqtSignal(str)
    
        def closeEvent(self, event):
            """Get the name of active window about to close
          """
            self.sigClosed.emit(self.windowTitle())
            QMdiSubWindow.closeEvent(self, event)
    
    
    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.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 = MdiSubWindow()
                sub.setWidget(QTextEdit())
                sub.setAttribute(Qt.WA_DeleteOnClose)
                sub.setWindowTitle("subwindow" + str(MainWindow.count))
                sub.sigClosed.connect(self.windowclosed)
                self.mdi.addSubWindow(sub)
                sub.show()

    【讨论】:

    • 工作得很好,谢谢。一次查询,当您调用 'sub.close()' 时;这会删除子窗口及其小部件吗?还是我必须调用 deleteLater()?
    • 默认没有,所以我添加了sub.setAttribute(Qt.WA_DeleteOnClose),它在窗口关闭时调用deleteLater()。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-22
    • 2020-02-07
    • 1970-01-01
    • 2021-08-15
    • 1970-01-01
    • 2016-08-13
    • 2012-06-24
    相关资源
    最近更新 更多