实战PyQt5: 050-选项卡控件QTabWidget

QTabWidget简介

在GUI应用软件中,多页面的切换的使用范围十分广泛,在操作过程中,用户使用鼠标点击不同的标题栏就可以方便展示不同页面的内容,众多界面共用一块显示区域,在有限的就显示区域中可以很方便地位用户显示更多的信息。

Qt为多页面切换的实现提供了一个专门的控件QTabWidget, 它可以实现在同一区域中自由切换不同页面的内容,该控件是一个容器类控件,并提供友好的页面切换方式。

QTabWidget常用方法有:

  • addTab(): 添加一个标签;
  • insertTab(): 在指定位置插入一个标签;
  • removeTab(): 删除指定索引的标签;
  • setTabText(): 设置指定索引标签的文本信息;
  • tabText(): 获得指定索引标签的文本信息;
  • setTabIcon(): 设置指定索引标签的图标;
  • tabIcon(): 获得指定索引标签的图标;
  • currentWidget(): 获得当前活动标签的部件;
  • widget(): 获得指定标签索引的部件;
  • indexOf(): 获得指定部件的标签索引;
  • count(): 总标签数;
  • setTabPosition(): 设置标签的显示位置,值为(北:QTabWidget.North, 南:QTabWidget.South, 西:QTabWidget.West, 东:QTabWidget.East);
  • setTabShape(): 设置标签的形状, 值为:(四边形:QTabWidget.Rounded, 三角形:QTabWidget.Triangular)。

QTabWidget常用信号:

  • currentChanged: 当前标签页发生改变后,发射该信号;
  • tabCloseRequested: 标签页关闭请求时,发射该信号;
  • tabBarClicked: 单击了标签条,发射该信号;
  • tabBarDoubleClicked: 双击了标签条,发射该信号。

QTabWidget类继承关系:

实战PyQt5: 050-选项卡控件QTabWidget

 

测试QTabWidget

创建文件qtabwidget,假设我们设计一个win10系统文件右键菜单属性对话框,其主要内容就是由选项卡控件实现, 在这里实现其选项卡框架, 完整代码如下:

import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QFont
from PyQt5.QtWidgets import (QApplication, QMainWindow, QWidget, 
                             QTabWidget, QMenuBar, QMenu, QAction,
                             QActionGroup, QVBoxLayout, QLabel)
 
class DemoTabWidget(QMainWindow):
    def __init__(self, parent=None):
        super(DemoTabWidget, self).__init__(parent)   
        
         # 设置窗口标题
        self.setWindowTitle('实战PyQt5: QTabWidget Demo!')      
        # 设置窗口大小
        self.resize(480, 360)
      
        self.initUi()
        
    def initUi(self):        
        self.initMenu()
        
        self.tw = QTabWidget(self)
        self.tw.addTab(self.createWidget(0), '常规')
        self.tw.addTab(self.createWidget(1), '快捷方式')
        self.tw.addTab(self.createWidget(2), '兼容性')
        self.tw.addTab(self.createWidget(3), '安全')
        self.tw.addTab(self.createWidget(4), '详细信息')
        self.tw.addTab(self.createWidget(5), '以前的版本')
        
        self.setCentralWidget(self.tw)
            
    def initMenu(self):
        menuBar = self.menuBar()
        #添加一个菜单项,在菜单项下课添加子菜单项
        fileMenu = menuBar.addMenu('文件')
        aExit = QAction('Exit', self)
        aExit.triggered.connect(self.close)
        fileMenu.addAction(aExit)
        
        #标签条位置控制
        posMenu = menuBar.addMenu('标签条位置')
        
        aNorth = QAction('上方', self)
        aNorth.setCheckable(True)
        aNorth.setChecked(True)
        aNorth.triggered.connect(lambda:self.changeTabPos(0))
        aSouth = QAction('下方', self)
        aSouth.setCheckable(True)
        aSouth.triggered.connect(lambda:self.changeTabPos(1))
        aWest = QAction('左边', self)
        aWest.setCheckable(True)
        aWest.triggered.connect(lambda:self.changeTabPos(2))
        aEast = QAction('右边', self)
        aEast.setCheckable(True)
        aEast.triggered.connect(lambda:self.changeTabPos(3))
    
        posGroup = QActionGroup(self)
        posGroup.addAction(aNorth)
        posGroup.addAction(aSouth)
        posGroup.addAction(aWest)
        posGroup.addAction(aEast)
        
        posMenu.addAction(aNorth)
        posMenu.addAction(aSouth)
        posMenu.addAction(aWest)
        posMenu.addAction(aEast)
        
        #标签条形状
        shapeMenu = menuBar.addMenu('标签条形状')
        aRounded = QAction('圆角矩形', self)
        aRounded.setCheckable(True)
        aRounded.setChecked(True)
        aRounded.triggered.connect(lambda:self.changeTabShape(0))
        aTriangular = QAction('三角形', self)
        aTriangular.setCheckable(True)
        aTriangular.triggered.connect(lambda:self.changeTabShape(1))
        
        shapeGroup = QActionGroup(self)
        shapeGroup.addAction(aRounded)
        shapeGroup.addAction(aTriangular)
        
        shapeMenu.addAction(aRounded)
        shapeMenu.addAction(aTriangular)
        
    def changeTabPos(self, index):
        switcher = {
            0: QTabWidget.North,
            1: QTabWidget.South,
            2: QTabWidget.West,
            3: QTabWidget.East
        }
        self.tw.setTabPosition(switcher.get(index))
        
    def changeTabShape(self, index):
        if index == 0:
            self.tw.setTabShape(QTabWidget.Rounded)
        else:
            self.tw.setTabShape(QTabWidget.Triangular)
            
    def createWidget(self, index):
        wid = QWidget()
        layout = QVBoxLayout(wid)
        label = QLabel(wid)
        label.setAlignment(Qt.AlignCenter)
        label.setFont(QFont(self.font().family(), 36))
        label.setText("选项卡 {}".format(index + 1))
        
        layout.addWidget(label)
        wid.setLayout(layout)
        return wid
    
if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = DemoTabWidget()
    window.show()
    sys.exit(app.exec())

运行结果如下图:

实战PyQt5: 050-选项卡控件QTabWidget

测试QTabWidget

本文知识点

  • 使用QTabWidget添加多个选项卡;
  • 改变选项卡标签的显示位置;
  • 改变选项卡标签的形状;
  • 使用QActionGroup实现一组菜单项的单选功能;
  • 改变QLabel字体的尺寸。

前一篇:  实战PyQt5: 049-滚动区域控件QScrollArea

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值