python -- PyQt5(designer)中文详细教程(六)控件1

news2024/11/19 7:25:10

控件1

控件就像是应⽤这座房⼦的⼀块块砖。PyQt5有很多的控件,⽐如按钮,单选框,滑动条,复选框等 等。在本章,我们将介绍⼀些很有⽤的控 件: QCheckBox , ToggleButton , QSlider , QProgressBar 和 QCalendarWidget 。

QCheckBox

QCheckBox 组件有俩状态:开和关。通常跟标签⼀起使用,用在激活和关闭⼀些选项的场景。

from PyQt5.QtWidgets import QWidget, QCheckBox, QApplication
from PyQt5.QtCore import Qt
import sys


class Example(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        cb = QCheckBox('Show title', self)
        cb.move(20, 20)
        cb.toggle()
        cb.stateChanged.connect(self.changeTitle)
        self.setGeometry(300, 300, 350, 150)
        self.setWindowTitle('QCheckBox')
        self.show()

    def changeTitle(self, state):

        if state == Qt.Checked:
            self.setWindowTitle('QCheckBox')
        else:
            self.setWindowTitle(' ')

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

这个例子中,有⼀个能切换窗口标题的单选框。

         cb = QCheckBox('Show title', self)

这个是 QCheckBox 的构造器。

        cb.toggle() # 切换复选框状态

要设置窗口标题,我们就要检查单选框的状态。默认情况下,窗口没有标题,单选框未选中。

        cb.stateChanged.connect(self.changeTitle)

把 changeTitle() ⽅法和 stateChanged 信号关联起来。这样, changeTitle() 就能切换窗口标题 了。

def changeTitle(self, state):

        if state == Qt.Checked:
            self.setWindowTitle('QCheckBox')
        else:
            self.setWindowTitle(' ')

控件的状态是由 changeTitle() ⽅法控制的,如果空间被选中,我们就给窗口添加⼀个标题,如果 没被选中,就清空标题。

程序展示:

 

切换按钮

切换按钮就是 QPushButton 的⼀种特殊模式。 它只有两种状态:按下和未按下。我们再点击的时候切换两种状态,有很多场景会使⽤到这个功能。

from PyQt5.QtWidgets import (QWidget, QPushButton,
 QFrame, QApplication)
from PyQt5.QtGui import QColor
import sys

class Example(QWidget):

    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.col = QColor(0, 0, 0)

        redb = QPushButton('Red', self)
        redb.setCheckable(True)
        redb.move(10, 10)
        redb.clicked[bool].connect(self.setColor)
        greenb = QPushButton('Green', self)
        greenb.setCheckable(True)
        greenb.move(10, 60)
        greenb.clicked[bool].connect(self.setColor)
        blueb = QPushButton('Blue', self)
        blueb.setCheckable(True)
        blueb.move(10, 110)
        blueb.clicked[bool].connect(self.setColor)
        self.square = QFrame(self)
        self.square.setGeometry(150, 20, 100, 100)
        self.square.setStyleSheet("QWidget { background-color: %s }" % self.col.name())
        self.setGeometry(300, 300, 380, 170)
        self.setWindowTitle('Toggle button')
        self.show()

    def setColor(self, pressed):
        source = self.sender()
        if pressed:
            val = 255
        else:
            val = 0
        if source.text() == "Red":
            self.col.setRed(val)
        elif source.text() == "Green":
            self.col.setGreen(val)
        else:
            self.col.setBlue(val)
        self.square.setStyleSheet("QFrame { background-color: %s }" % self.col.name())


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

 我们创建了⼀个切换按钮和⼀个 QWidget ,并把 QWidget 的背景设置为黑色。点击不同的切换按钮,背景⾊会在红、绿、蓝之间切换(而且能看到颜色合成的效果,而不是单纯的颜色覆盖)。

self.col = QColor(0, 0, 0)

设置颜色为黑色。

redb = QPushButton('Red', self)
        redb.setCheckable(True)
        redb.move(10, 10)

创建⼀个 QPushButton ,然后调用它的 setCheckable() 的方法就把这个按钮变成了切换按钮。

        redb.clicked[bool].connect(self.setColor)

把点击信号和我们定义好的函数关联起来,这里是把点击事件转换成布尔值。

        source = self.sender()

获取被点击的按钮。

if source.text() == "Red":

        self.col.setRed(val)

如果是标签为“red”的按钮被点击,就把颜⾊更改为预设好的对应颜色。

         self.square.setStyleSheet("QFrame { background-color: %s }" % self.col.name())

使用样式表(就是CSS的SS)改变背景色。

程序展示:

滑块

        QSlider 是个有⼀个小滑块的组件,这个小滑块能拖着前后滑动,这个经常⽤于修改⼀些具有范围 的数值,比文本框或者点击增加减少的⽂本框(spin box)方便多了。

本例用⼀个滑块和⼀个标签展示。标签为⼀个图片,滑块控制标签(的值)。

先弄个叫mute.png的静⾳图标准备着。

from PyQt5.QtWidgets import (QWidget, QSlider,
 QLabel, QApplication)
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QPixmap
import sys


class Example(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        sld = QSlider(Qt.Horizontal, self)
        sld.setFocusPolicy(Qt.NoFocus)
        sld.setGeometry(30, 40, 100, 30)
        sld.valueChanged[int].connect(self.changeValue)
        self.label = QLabel(self)
        self.label.setPixmap(QPixmap('mute.png'))
        self.label.setGeometry(160, 40, 80, 30)
        self.setGeometry(300, 300, 380, 170)
        self.setWindowTitle('QSlider')
        self.show()

    def changeValue(self, value):
        if value == 0:
            self.label.setPixmap(QPixmap('mute.png'))
        elif value > 0 and value <= 30:
            self.label.setPixmap(QPixmap('min.png'))
        elif value > 30 and value < 80:
            self.label.setPixmap(QPixmap('med.png'))
        else:
            self.label.setPixmap(QPixmap('max.png'))


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

 这⾥是模拟的音量控制器。拖动滑块,能改变标签位置的图片。

        sld = QSlider(Qt.Horizontal, self)

创建⼀个水平的 QSlider 。

        self.label = QLabel(self)

        self.label.setPixmap(QPixmap('mute.png'))

创建⼀个 QLabel 组件并给它设置⼀个静音图标。

        sld.valueChanged[int].connect(self.changeValue)

把 valueChanged 事件跟 changeValue() 方法关联起来。

if value == 0:
            self.label.setPixmap(QPixmap('mute.png'))
        elif value > 0 and value <= 30:
            self.label.setPixmap(QPixmap('min.png'))
        elif value > 30 and value < 80:
            self.label.setPixmap(QPixmap('med.png'))
        else:
            self.label.setPixmap(QPixmap('max.png'))
根据音量值的大小更换标签位置的图片。这段代码是:如果⾳量为0,就把图片换成 mute.png。 程序展示:

 图片没找好,效果不佳,程序是没有问题的:

进度条

进度条是用来展⽰任务进度的(我也不想这样说话)。它的滚动能让⽤户了解到任务的进 度。 QProgressBar 组件提供了⽔平和垂直两种进度条,进度条可以设置最大值和最小值,默认情况 是0~99。

from PyQt5.QtWidgets import (QWidget, QProgressBar,
 QPushButton, QApplication)
from PyQt5.QtCore import QBasicTimer
import sys


class Example(QWidget):

    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.pbar = QProgressBar(self)
        self.pbar.setGeometry(30, 40, 200, 25)
        self.btn = QPushButton('Start', self)
        self.btn.move(40, 80)
        self.btn.clicked.connect(self.doAction)
        self.timer = QBasicTimer()
        self.step = 0
        self.setGeometry(300, 300, 380, 170)
        self.setWindowTitle('QProgressBar')
        self.show()

    def timerEvent(self, e): # 重载函数
        if self.step >= 100:
            self.timer.stop()
            self.btn.setText('Finished')
            return
        self.step = self.step + 1
        self.pbar.setValue(self.step)

    def doAction(self):
        if self.timer.isActive():
            self.timer.stop()
            self.btn.setText('Start')
        else:
            self.timer.start(100, self)
            self.btn.setText('Stop')


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

 我们创建了⼀个水平的进度条和⼀个按钮,这个按钮控制进度条的开始和停⽌。

        self.pbar = QProgressBar(self)

新建⼀个 QProgressBar 构造器。

        self.timer = QtCore.QBasicTimer()

用时间控制进度条。

        self.timer.start(100, self)

调⽤ start() 方法加载⼀个时间事件。这个⽅法有两个参数:过期时间(即这个时间的持续时间) 和事件接收者。

 def timerEvent(self, e): # 重载函数
        if self.step >= 100:
            self.timer.stop()
            self.btn.setText('Finished')
            return
        self.step = self.step + 1
        self.pbar.setValue(self.step)

每个 QObject 和由它继承⽽来的对象都有⼀个 timerEvent() 事件处理函数。为了触发事件,我们重 载了这个方法。

 def doAction(self):
        if self.timer.isActive():
            self.timer.stop()
            self.btn.setText('Start')
        else:
            self.timer.start(100, self)
            self.btn.setText('Stop')

里面的 doAction() ⽅法是⽤来控制开始和停止的。

程序展示:

 

日历

QCalendarWidget 提供了基于月份的日历插件,⼗分简易而且直观。

from PyQt5.QtWidgets import (QWidget, QCalendarWidget,
 QLabel, QApplication, QVBoxLayout)
from PyQt5.QtCore import QDate
import sys


class Example(QWidget):

    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        vbox = QVBoxLayout(self)
        cal = QCalendarWidget(self)
        cal.setGridVisible(True)
        cal.clicked[QDate].connect(self.showDate)
        vbox.addWidget(cal)
        self.lbl = QLabel(self)
        date = cal.selectedDate() # 默认选中当前⽇期
        self.lbl.setText(date.toString())
        vbox.addWidget(self.lbl)
        self.setLayout(vbox)
        self.setGeometry(300, 300, 350, 300)
        self.setWindowTitle('Calendar')
        self.show()

    def showDate(self, date):
        self.lbl.setText(date.toString())

        
if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

这个例子有日期组件和标签组件组成,标签显示被选中的日期。

        cal = QCalendarWidget(self)

创建⼀个 QCalendarWidget 。

        cal.clicked[QDate].connect(self.showDate)

选择⼀个日期时, QDate 的点击信号就触发了,把这个信号和我们自己定义的 showDate() 方法关联起来。

        def showDate(self, date):

                self.lbl.setText(date.toString())

 使用selectedDate() ⽅法获取选中的日期,然后把日期对象转成字符串,在标签里面显示出来。 程序展示:

 一个月以后:

 ​​​

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/69905.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

关于JavaScript运算符的学习

关于博主每篇博文的浪漫主义 【“仅此105秒&#xff0c;无法超越的绝美画面!&#xff01;”】 https://www.bilibili.com/video/BV1nW4y1x78x/?share_sourcecopy_web&vd_source385ba0043075be7c24c4aeb4aaa73352 “仅此105秒&#xff0c;无法超越的绝美画面!&#xff01;…

应用案例:有源无源电路协同仿真

01 有源无源电路协同仿真 随着电路系统集成度和信号速率的提高&#xff0c;电路中的电磁场效应越来越明显&#xff0c;单纯使用电路分析方法已不能满足仿真评估精度要求&#xff0c;这种情况下必须对问题进行分解&#xff0c;采用三维电磁场全波方法对信号传播路径上的封装与…

[附源码]计算机毕业设计JAVA在线文献查阅系统

[附源码]计算机毕业设计JAVA在线文献查阅系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybati…

C# 拖放操作

一 拖放操作 拖放操作Drag and Drop是两个窗口之间传递数据的一种手段。 1 拖放操作两部分&#xff1a;拖Drag、放Drop 几个术语&#xff1a; ① 源窗口&#xff1a;发起拖拽StartDrag; ② 目标窗口&#xff1a;接受拖放AcceptDraop; ③ 拖拽物&#xff1a;即传输的数据Dat…

ChatGPT有多厉害,影响到谷歌地位?

AI神器ChatGPT 火了。 能直接生成代码、会自动修复bug、在线问诊、模仿莎士比亚风格写作……各种话题都能hold住&#xff0c;它就是OpenAI刚刚推出的——ChatGPT。 有脑洞大开的网友甚至用它来设计游戏&#xff1a;先用ChatGPT生成游戏设定&#xff0c;再用Midjourney出图&…

外贸小白,一直不出单怎么办?

米贸搜今天&#xff0c;试着给新人一些方法和技巧&#xff0c;让你尽快在公司立足&#xff01; 事实上&#xff0c;规定几个月内下单的公司&#xff0c;往往都是平台有投资&#xff0c;去展会了&#xff0c;有大量营销费用的公司。当然&#xff0c;老板急着收回成本。对于有足…

网络基本概念

文章目录前言网络分层原因网络分层模型各层大致用途主机网络层网际层传输层应用层总结前言 在日常开发中&#xff0c;大家总是会或多或少的遇到一些网络通信的相关代码&#xff0c;如http请求调用。但是我们却不知道&#xff0c;数据是怎么从一台计算机到另一台计算机的&#…

opcj-如何通过一个项目征服Java

Java早已经不是高大山的稀世珍品了&#xff0c;程序员也不再是高科技工作者&#xff0c;而被称为码农 &#xff0c;为什么呢&#xff1f;因为Java后台的很多基础技术都已经固定了&#xff0c;也就是说主要你从头到尾学一遍就能会 &#xff0c;淘宝双十一搞不定&#xff0c;但是…

2022-12-07 小米pro路由(R3G) 刷固件 openwrt

环境准备&#xff1a;路由开启SSH 1.先登录小米开发者平台&#xff0c;解开小米路由的SSH http://www.miwifi.com/miwifi_open.html 2.路由连接电脑&#xff0c;通过SSH可直接登录到小米路由 本教程以R3G 为例 第一步: 刷入 BREED 如何刷入breed 不同设备方法不同,可以直接U…

通俗地讲讲数据降维的原理

什么是数据降维&#xff1f;关于这个问题&#xff0c;很多专家的说法都非常学术&#xff0c;估计很多普通人听不懂。所以&#xff0c;这里用通俗的语言解释一下&#xff0c;希望有助于更多的入门新人理解。 举一个简单的例子&#xff1a;假设一个小学的班级有5个学生&#xff…

Spring Boot 入门到精通(一)

文章目录一、Spring Boot 介绍1. 概念2.maven构建Spring Boot项目3. 自定义banner4. Spring Boot的全局配置文件5. Spring Boot项目的发布方式二、Spring Boot注入方式1. Value方式2. ConfigurationProperties方式3. SpringBoot默认注入方式4. SpringBoot中的默认配置三、Sprin…

Element组件库的用法步骤

Element地址&#xff1a;适用于pc端后台开发 Element - The worlds most popular Vue UI frameworkElement&#xff0c;一套为开发者、设计师和产品经理准备的基于 Vue 2.0 的桌面端组件库https://element.eleme.io/#/zh-CN/ 下载 点击 “组件”在安装部分有下载命令&#xf…

东京大学和积水房屋启动生物多样性和健康联合研究

东京大学农业与生命科学研究生院(GSALS)和积水房屋株式会社(Sekisui House, Ltd.)将于2022年12月1日启动关于生物多样性和人类健康的联合研究项目。该项目将调查生物多样性和城市自然环境对人类健康和幸福的益处。这项全球首创的举措将全面调查居民与附近生物多样性丰富的花园环…

Java入门教程(17)——循环语句

文章目录1.while 循环2. do-while 循环3. for 循环我们表白的时候&#xff0c;你可以做我女朋友么&#xff0c;这次拒绝了&#xff0c;下次“你可以做我女朋友么”&#xff0c;直到同意做你女朋友。以后就不会再问了&#xff0c;这就是循环1.while 循环 语法结构&#xff1a; w…

从“挖土豆”到全场景营销,纷享销客CRM如何助力噢易云可持续增长?

近年来&#xff0c;随着云计算技术的发展和普及&#xff0c;桌面云也得到了越来越广泛的应用&#xff0c;尤其是在教育、医疗、金融、能源、连锁等对安全、成本和系统化管控有着强要求的行业中。 根据第三方研究机构的统计&#xff0c;2021年中国桌面云整体解决方案销量达到了…

Java Object类常用API

JavaObject类常用API\huge{Java\space Object类常用API}Java Object类常用API API 首先解释一下什么是APIAPIAPI。 API(ApplicationProgramminginterface)API(Application Programming interface)API(ApplicationProgramminginterface)&#xff1a;应用程序编程接口。 简单来…

docker 查看容器启动命令(已运行的容器)

eg: 1 docker ps 查看正在运行的容器: 通过docker ps命令 该命令主要是为了详细展示查看运行时的command参数 docker ps -a --no-trunc | grep container_name # 通过docker --no-trunc参数来详细展示容器运行命令 通过docker inspect命令 使用docker inspect&#xff0c;但…

Letbook Cookbook题单——数组3

Letbook Cookbook题单——数组3 48. 旋转图像 难度中等 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 示例 1&#xff1a;…

左(7)--kmp,manacher,morris

前言 仅记录学习笔记&#xff0c;如有错误欢迎指正。 题目&#xff1a; 思路&#xff1a;实现1个函数infect()&#xff0c;把1连接的位置都变为2&#xff0c;此时算一个岛。 如何设计一个并行算法解决这个问题&#xff1f; 在多个cpu中 每次存入分界线的信息&#xff0c;…

拓扑排序与关键路径

一、拓扑排序 1.1 什么是拓扑排序 对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序&#xff0c;是将G中所有顶点排成一个线性序列&#xff0c;使得图中任意一对顶点u和v&#xff0c;若边<u,v>∈E(G)&#xff0c;则u在线性序列中出现在v之前。通常&#x…