QTabWidget的使用

同类型的窗口不想放太多?想做类似网页上面那种页签?!
好,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!

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值