pyqt图形化显示—3.常用控件

前面已经能够通过组合构建一个基础的能交互的ui了,接下来就是丰富界面了,一些常用控件走起~

下拉框

界面

首先导入对应库

from PySide6.QtWidgets import  QComboBox, QVBoxLayout
QComboBox是下拉框的列表库,QVBoxLayout是垂直布局库,不使用垂直布局没办法表现下拉列表
下面就是构建一个下拉框了
cb = QComboBox()  # 创建下拉框
cb.addItems(['a','b','c','d'])  # 添加选项
        
self.setWindowTitle('下拉框')  # 设置窗口标题
ml = QVBoxLayout()  # 创建主布局
ml.addWidget(cb)  # 将下拉框添加到主布局中
self.setLayout(ml)  # 设置主布局

image

界面属性和基础空间一样,可以通过QT Designer找属性设置 

那么页面ui完成,下面就是交互了

信号

常用的有以下两种

cb.currentTextChanged.connect(self.test)
cb.currentIndexChanged.connect(self.test)

表示选项变化时,发出信号,触发test函数

不过这两个也是有一些细微差别的,返回的内容是有所不同的

我们用test函数测试一下

    def test(self,x):
        print('当前选项:', x)
currentTextChanged的信号触发时候,会返回选项的内容       image
currentIndexChanged的信号触发时,会返回选项在列表的位置【下标】    image
当然 由于这个信号是变化时候出发的,也可以使用cb.currentText()读取当前选项

选择框

界面

导入库
from PySide6.QtWidgets import QCheckBox, QVBoxLayout

QCheckBox就是这个选择框的库啦

界面ui类似于上面的下拉框,不过由于是选择框的形式,只有是否两种状态,所以只能填入一个元素

cb = QCheckBox('测试一下')  # 创建选择框


self.setWindowTitle('选择框')  # 设置窗口标题
ml = QVBoxLayout()  # 创建主布局
ml.addWidget(cb)  # 将选择框添加到主布局中
self.setLayout(ml)  # 设置主布局

创建选择框,添加得到布局中显示

image

信号

由于只有是否两种状态,信号上就没有那么花里胡哨了 只有一个
cb.stateChanged.connect(self.test)

状态改变就触发对应函数响应,返回值是一个整数

测试了一下这个选择框有结果,选择返回结果为2,不选择返回结果为0【也许还有半选的选项】    image

cb.stateChanged.connect(lambda :print(cb.isChecked()))

也可以使用cb.isChecked()检测是否被选中,返回值为True和False,选中为True     image

单选框

界面

导入库

from PySide6.QtWidgets import QRadioButton, QButtonGroup, QVBoxLayout, 
QRadioButton库是单选框的库;QButtonGroup是选项按钮组的库,后续解决一些逻辑问题;QVBoxLayout是垂直布局库
下面就是单选框的ui设置了
        lb1 = QLabel('表头1')  # 添加选项标题

        # 创建选项按钮
        btn1 = QRadioButton('选项1')
        btn2 = QRadioButton('选项2')
        btn3 = QRadioButton('选项3')

        ml = QVBoxLayout()  # 创建主布局
        # 添加到主布局中
        ml.addWidget(lb1)
        ml.addWidget(btn1)
        ml.addWidget(btn2)
        ml.addWidget(btn3)
        self.setLayout(ml)  # 设置主布局

由于是单选框那么就出现非此即彼的关系如下图,我只能在三个选项中选择一个  image

但只是如同上图一样一个表头三个选项那还好,如果两个表头,三个表头,我需要在多个问题中选择答案,那么这个非此即彼的关系就会让我们的选项总是只存在一个。关于这个逻辑问题就需要QButtonGroup来解决了,把特定的按钮进行组合,在这个组合内存在非此即彼的关系,与组合外无关。

        self.group1 = QButtonGroup(self)  # 创建单选框组

        lb1 = QLabel('表头1')  # 添加选项标题

        # 创建选项按钮
        btn1 = QRadioButton('选项1')
        btn2 = QRadioButton('选项2')
        btn3 = QRadioButton('选项3')
  
        # 添加选项到单选框组中
        self.group1.addButton(btn1)
        self.group1.addButton(btn2)
        self.group1.addButton(btn3)

        # 创建布局
        h1 = QVBoxLayout()  # 创建布局
        # 添加到布局中
        h1.addWidget(lb1)
        h1.addWidget(btn1)
        h1.addWidget(btn2)
        h1.addWidget(btn3)

        ml = QVBoxLayout()  # 创建主布局
        ml.addLayout(h1)  # 布局添加到主布局中

        self.setLayout(ml)  # 设置主布局
View Code

通过self.组合名 = QButtonGroup(self)创建按钮组合,self.组合名.addButton(按钮名)把按钮添加到组合内,实现组合内的逻辑关系

虽然界面是一致的,但多个表头的逻辑关系已经发生了区分

checkedButton 函数查看按钮是否被选中,有时候也是有用的

信号

由于上述已经将对应按钮进行了分组,那么我们可以直接对组进行信号处理

self.group1.buttonClicked.connect(self.test)
self.组合名.buttonClicked.connect(响应函数) 作用是该组合按钮被点击,触发对应函数响应,返回值是按钮名称地址,需要转换一下得到按钮有名称    image
    def test(self,x):
        print(x.text())

 文本框

文本框一般有两种形式一种是富文本框(QTextEdit),类似于ppt那种文本框可以插入图片,表格啊甚至HTML格式;另一种是纯文本框(QPlainTextEdit),只应用于纯文本。两者各有优劣,前者文本框内容表现更丰富,但相对的占用的资源就多;后者纯文本,对于大量文本处理响应更快

界面

导入库

from PySide6.QtWidgets import QTextEdit, QPlainTextEdit

已经介绍了一个是富文本框,一个是纯文本框

下面就是设置和属性部分了,作为对比两个文本框同时显示,上面为富文本框,下面为纯文本框

        text1 = QTextEdit()  # 创建文本框
        text1.setHtml('<h1>标题</h1><b>加粗</b><i>斜体</i><u>下划线</u>')
        #text1.setMarkdown('# 标题\n**加粗** *斜体* _下划线_')
        #text1.setText('测试一下')
        #text1.setPlainText('测试一下')

        text2 = QPlainTextEdit()  # 创建文本框
        text2.setPlainText('<h1>标题</h1><b>加粗</b><i>斜体</i><u>下划线</u>')

        ml = QVBoxLayout()  # 创建主布局
        ml.addWidget(text1)  # 添加到主布局中
        ml.addWidget(text2)
        self.setLayout(ml)  # 设置主布局
文本框

image

通过对比就可以发现两者的区别,同样的在属性上富文本框的属性会更多一些,超链接啊,图片啊等等,可以在文档中查到

.appendPlainText('xx')  在文本框结尾添加文本 ‘xx’

.clear() 清除 等等等等

信号

常用的就一个textChanged 文本变化时触发响应,无返回值

滑条

界面

导入库

from PySide6.QtWidgets import QSlider
from PySide6.QtCore import Qt #枚举类需要使用

下面就是设置参数和属性了

sd = QSlider(Qt.Orientation.Horizontal)  # 创建水平滑条
sd.setTickPosition(QSlider.TickPosition.TicksRight)  # 设置滑条刻度位置
sd.setTickInterval(10)  # 设置滑条刻度间隔
sd.setMinimum(0)  # 设置滑条的最小值
sd.setMaximum(100)  # 设置滑条的最大值
# sd.setRange(0, 100)  # 设置滑条的范围
sd.setSingleStep(5)  # 设置滑条的单步值
sd.setValue(50)  # 设置滑条的初始值

设置完成后添加到布局内显示

image

 QSlider  如果不设置那么结果为垂直滑条

setTickPosition  可以设置刻度的位置参数如下
  参数:   NoTicks      ——>无刻度
      TicksBothSides  ——>两侧刻度
      TicksAbove      ——>上侧刻度
      TicksBelow      ——>下侧刻度
      TicksLeft     ——>左侧刻度
      TicksRight        ——>右侧刻度

信号

sd.valueChanged.connect(self.test)  # 连接滑条的valueChanged信号到槽函数

数值发生改变时候,对应函数响应

    def test(self):
        widget = self.sender()  # 获取发送信号的对象
        print(f'滑条的值已改变:{widget.value()}')

注意返回值是对应的刻度数值

image

self.sender() 用于获取该信号是由那个变量发送的,方便大型项目多个同类型变量的逻辑处理

 

posted @ 2026-01-07 12:11  Berserker兰斯洛特  阅读(10)  评论(0)    收藏  举报