同类型的窗口不想放太多?想做类似网页上面那种页签?!
好,Qt能满足你的一切需求,实现效果如下,文末会附上一些关键代码的解释,这个东西的使用较为简单,就没有书写思路这种东西了
下面给了一个QTabWidget实现的最最基本的框架
# -*- coding: utf-8 -*-
from PyQt5 import QtGui
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication, QTabWidget, QMenu, QAction, QVBoxLayout, QPushButton, QWidget
class DockWindow(QWidget):
def __init__(self, name, parent=None):
super(DockWindow, self).__init__(parent)
self.parent = parent
self.setContentsMargins(0, 0, 0, 0)
self.setWindowTitle(name)
class MainWindow(QTabWidget):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.setTabsClosable(True)
self.tabCloseRequested.connect(self.onCloseTab)
self.currentChanged.connect(self.onChangeTab)
self.setMovable(True)
self.currIndex = None
widget1 = self.addTabFast("第一个页签")
widget2 = self.addTabFast("第二个页签")
widget3 = self.addTabFast("第三个页签")
widget4 = self.addTabFast("第四个页签")
verLayout = QVBoxLayout()
verLayout.addWidget(QPushButton("为了表现每个窗口不一样,我是1号"))
widget1.setLayout(verLayout)
verLayout = QVBoxLayout()
verLayout.addWidget(QPushButton("我变了,我是2号"))
widget2.setLayout(verLayout)
verLayout = QVBoxLayout()
verLayout.addWidget(QPushButton("我又变了,我是3号"))
widget3.setLayout(verLayout)
verLayout = QVBoxLayout()
verLayout.addWidget(QPushButton("没想到吧,我是4号"))
widget4.setLayout(verLayout)
def addTabFast(self, name):
widget = DockWindow(name)
self.addTab(widget, name)
return widget
def onCloseTab(self, index):
widget = self.widget(index)
widget.close()
self.removeTab(index)
def onChangeTab(self, index):
# -1表示当前无窗口
if index != -1:
widget = self.widget(index)
self.currIndex = index
print("当前切换到的是:", widget.windowTitle())
def mouseReleaseEvent(self, event):
super(MainWindow, self).mouseReleaseEvent(event)
if event.button() == Qt.RightButton:
menu = QMenu(self)
action1 = QAction("另存为", self)
action2 = QAction("保存", self)
action3 = QAction("关闭", self)
menu.addAction(action1)
menu.addAction(action2)
menu.addAction(action3)
menu.exec_(QtGui.QCursor().pos())
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
mainWindow = MainWindow()
mainWindow.show()
sys.exit(app.exec_())
几个关键代码解析:
1、self.setTabsClosable(True)
gif中上方tab的关闭按钮看到了吗,他的作用就是这
2、self.setMovable(True)
gif中上方tab可以拖动,他的作用就是这
3、self.currentChanged.connect(self.onChangeTab)
QTabWidget中的关键信号,当页签切换的时候发出
4、self.tabCloseRequested.connect(self.onCloseTab)
QTabWidget中的关键信号,当页签关闭的时候发出,并且此时我们要在其中加入QTabWidget.removeTab(index),这样才能移除该tab
5、我们可以通过QTabWidget.widget(int num)来获取对应tab下的widget!