📜  PyQt-多文档界面

📅  最后修改于: 2020-11-08 08:11:23             🧑  作者: Mango


典型的GUI应用程序可能具有多个窗口。选项卡式和堆叠式小部件允许一次激活一个这样的窗口。但是,很多时候这种方法可能没有用,因为其他窗口的视图被隐藏了。

同时显示多个窗口的一种方法是将它们创建为独立的窗口。这称为SDI(单个文档接口)。这需要更多的内存资源,因为每个窗口可能都有其自己的菜单系统,工具栏等。

MDI(多文档界面)应用程序消耗较少的内存资源。子窗口相对于彼此放置在主容器内。容器小部件称为QMdiArea

QMdiArea小部件通常占据QMainWondow对象的中央小部件。此区域中的子窗口是QMdiSubWindow类的实例。可以将任何QWidget设置为subWindow对象的内部窗口小部件。 MDI区域中的子窗口可以级联或平铺方式排列。

下表列出了QMdiArea类和QMdiSubWindow类的重要方法-

Sr.No. Methods & Description
1

addSubWindow()

Adds a widget as a new subwindow in MDI area

2

removeSubWindow()

Removes a widget that is internal widget of a subwindow

3

setActiveSubWindow()

Activates a subwindow

4

cascadeSubWindows()

Arranges subwindows in MDiArea in a cascaded fashion

5

tileSubWindows()

Arranges subwindows in MDiArea in a tiled fashion

6

closeActiveSubWindow()

Closes the active subwindow

7

subWindowList()

Returns the list of subwindows in MDI Area

8

setWidget()

Sets a QWidget as an internal widget of a QMdiSubwindow instance

QMdiArea对象发出subWindowActivated()信号,而windowStateChanged()信号由QMdisubWindow对象发出。

在下面的示例中,由QMainWindow组成的顶级窗口具有一个菜单和MdiArea。

self.mdi = QMdiArea()
self.setCentralWidget(self.mdi)
bar = self.menuBar()
file = bar.addMenu("File")

file.addAction("New")
file.addAction("cascade")
file.addAction("Tiled")

菜单的Triggered()信号连接到windowaction()函数。

file.triggered[QAction].connect(self.windowaction)

菜单的新操作在MDI区域中添加了一个子窗口,其标题带有递增编号。

MainWindow.count = MainWindow.count+1
sub = QMdiSubWindow()
sub.setWidget(QTextEdit())
sub.setWindowTitle("subwindow"+str(MainWindow.count))
self.mdi.addSubWindow(sub)
sub.show()

菜单的级联和平铺按钮分别以级联和平铺方式排列当前显示的子窗口。

完整的代码如下-

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

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):
      print "triggered"
        
   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()
        
   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()

上面的代码产生以下输出-

多文档界面输出1多文档界面输出2多文档界面输出3