本文要实现的功能是通过pyqt的QTabWidget页签栏切换,实现不同页面表单的展示。效果如下

入门 PyQt6 看过来(案例)15~ 选项卡_web3.py

要实现这个功能用到的控件类是QTabWidget,我们接下来先来介绍一下QTabWidget的功能,然后再说设计思路,然后是代码实现。

1 QTabWidget选项卡类

选项卡控件属于QTabWidget类,它可以将窗口设计成多页,默认显示第一个选项卡的页面。通过单击各选项卡可以查看对应的页面。如果在一个窗口中显示的控件很多,则可以先进行拆分,分别放到不同的页面中。不同的页面中的控件的名称不能相同。

QTabWidget类常用的方法如下表所示:

方法

说明

addTab()

添加选项卡

insertTab()

插入选项卡

removeTab()

删除选项卡

currentWidget()

获取当前选项卡

currentIndex()

获取当前选项卡的索引

setCurrentIndex()

设置当前选项卡的索引

setCurrentWidget()

设置当前选项卡

setTabPosition()

设置选项卡的标题位置(QTabWidget.TabPosition.x)

North:标题在北方,即上边(默认)

South:标题在南方,即下边

West:标题在西方,即左边

East:标题在东方,即右边

setTabsClosable()

设置是否可以独立关闭选项卡,True表示可以关闭,在每个选项卡旁边会有一个关闭按钮,False表示不可以关闭。

setTabText()

设置选项卡的标题文本

tabText()

获取指定选项卡的标题文本

注意:在显示选项卡时,如果默认大小显示不下,会自动生成向前和向后的箭头,用户可以单击箭头查看未显示的选项卡。

选项卡控件最常用的信号是切换选项卡的时候发出的currentChanged.

2 功能设计

  • 功能包含基本信息和编程语言两个选项。如下图:
  • 入门 PyQt6 看过来(案例)15~ 选项卡_pyqt_02

  • 我们只需要设计这两个选项卡就可以了。然后就是在这两个选项卡里设置输入框,标签,以及单选按钮和确定按钮。
  • 编程语言选项下需要配置多选选项按钮:
  • 入门 PyQt6 看过来(案例)15~ 选项卡_windows_03

3 代码实现:

3.1 首先先实现选项卡的配置
#tabW1和tabW2分别为加入选项卡1和选项卡2
        self.tabW1=QWidget()
        self.tabW2=QWidget()
        self.addTab(self.tabW1,"选项卡1")
        self.addTab(self.tabW2,"选项卡2")
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
3.2 选项卡1里放置内容

上部分:姓名和性别部分

#性别单选按钮
		fLayout=QFormLayout()
        self.xm=QLineEdit()
        self.xb1=QRadioButton('男')
        self.xb2=QRadioButton('女')
        self.xb1.setChecked(True)
        self.csny=QLineEdit()
        btn=QPushButton("确定")
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

下部分放置生日和确定按钮

hLay=QHBoxLayout()
        hLay.addWidget(self.xb1)
        hLay.addWidget(self.xb2)
        fLayout.addRow('姓名:',self.xm)
        fLayout.addRow('性别:',hLay)
        fLayout.addRow('出生年月',self.csny)
        fLayout.addRow(' ', btn)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

最后把这些信息在选项一中配置好一起放菜单1的基本信息里:

# 修改第一个选项卡标题为 基本信息
        self.setTabText(0,'基本信息')
        self.tabW1.setLayout(fLayout)
  • 1.
  • 2.
  • 3.
3.3 选项二的配置

主要配置就是多选盒子配置

hLay=QHBoxLayout()
        self.cb1=QCheckBox("C++")
        self.cb2=QCheckBox("Java")
        self.cb3=QCheckBox("C#")
        self.cb1.setChecked(True)
        hLay.addWidget(self.cb1)
        hLay.addWidget(self.cb2)
        hLay.addWidget(self.cb3)
		#设置第二个选项的名字未“编程语言”
        self.setTabText(1,"编程语言")
        self.tabW2.setLayout(hLay)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
3.4 配置槽函数

当点击单选按钮多选按钮以及确定的时候,抽发的函数:clickedFunc

def clickedFunc(self):
        print(self.xm.text())
        print(self.csny.text())
        if self.xb1.isChecked():
            print(self.xb1.text())
        else:
            print(self.xb2.text())
        # 检查第二个选项卡中的控件
        if self.cb1.isChecked():
            print(self.cb1.text())
        if self.cb2.isChecked():
            print(self.cb2.text())
        if self.cb3.isChecked():
            print(self.cb3.text())
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.

这样,整个设计就完成了。

4 完整代码

大家可以尝试以下完整代码,效果很不错的。

# -*- coding:utf-8 -*-
"""
------------------------------------------------
File Name: 选项卡.py
Description:
Author: lzq
date:2024-07-28 16:42
------------------------------------------------
"""
import sys
from PyQt6.QtWidgets import QDialog, QPushButton, QVBoxLayout, QApplication, QTabWidget, QWidget, QFormLayout, \
    QLineEdit, QRadioButton, QHBoxLayout, QCheckBox


class MyTabWidget(QTabWidget):
    def __init__(self, parent=None):
        super(MyTabWidget, self).__init__(parent)
        self.initUI()
    def initUI(self):
        self.setGeometry(300,300,300,160)
        self.setWindowTitle("QTabWidget测试")
        # 创建选项卡位置 North为上 South下
        self.setTabPosition(QTabWidget.TabPosition.North)

        #tabW1和tabW2分别为加入选项卡1和选项卡2
        self.tabW1=QWidget()
        self.tabW2=QWidget()
        self.addTab(self.tabW1,"选项卡1")
        self.addTab(self.tabW2,"选项卡2")
        self.tabW1_UI()
        self.tabW2_UI()

    def tabW1_UI(self):
        fLayout=QFormLayout()
        self.xm=QLineEdit()
        self.xb1=QRadioButton('男')
        self.xb2=QRadioButton('女')
        self.xb1.setChecked(True)
        self.csny=QLineEdit()
        btn=QPushButton("确定")
        btn.clicked.connect(self.clickedFunc)
        hLay=QHBoxLayout()
        hLay.addWidget(self.xb1)
        hLay.addWidget(self.xb2)
        fLayout.addRow('姓名:',self.xm)
        fLayout.addRow('性别:',hLay)
        fLayout.addRow('出生年月',self.csny)
        fLayout.addRow(' ', btn)
        # 修改第一个选项卡标题为 基本信息
        self.setTabText(0,'基本信息')
        self.tabW1.setLayout(fLayout)
    def tabW2_UI(self):
        hLay=QHBoxLayout()
        self.cb1=QCheckBox("C++")
        self.cb2=QCheckBox("Java")
        self.cb3=QCheckBox("C#")
        self.cb1.setChecked(True)
        hLay.addWidget(self.cb1)
        hLay.addWidget(self.cb2)
        hLay.addWidget(self.cb3)
        self.setTabText(1,"编程语言")
        self.tabW2.setLayout(hLay)
    def clickedFunc(self):
        print(self.xm.text())
        print(self.csny.text())
        if self.xb1.isChecked():
            print(self.xb1.text())
        else:
            print(self.xb2.text())
        # 检查第二个选项卡中的控件
        if self.cb1.isChecked():
            print(self.cb1.text())
        if self.cb2.isChecked():
            print(self.cb2.text())
        if self.cb3.isChecked():
            print(self.cb3.text())


if __name__=='__main__':
    app = QApplication(sys.argv)
    w = MyTabWidget()
    w.show()
    sys.exit(app.exec())
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.

本文到此结束,有本事你就别点赞,别关注我。路老师一生清贫,上有老下有小,让我一个人默默的付出吧!