代码编织梦想

写作思路

这次使用到的空间有以下几种:
1、QPushButton 是我们之前用的按钮,也可以当作Toggle用
2、QCheckBox
3、QSlider
4、QCalendarWidget
5、QProgressBar
效果如下,可以改变QFrame的颜色,只有选中了对应Toggle才能改变对应的颜色通道,CheckBox可以控制Slider是否显示,然后加入了日历QCalendarWidget,QProgressBar进度条满了就自动跳下一个月

在这里插入图片描述

# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import (QWidget, QSlider,
                             QLabel, QApplication, QPushButton, QVBoxLayout, QCheckBox, QHBoxLayout, QFrame,
                             QCalendarWidget, QProgressBar)
from PyQt5.QtCore import Qt, pyqtSignal, QBasicTimer
from PyQt5.QtGui import QColor


class FrequentlyTogether(QWidget):
    colorChangeSignal = pyqtSignal(int, float)
    colorIsSelectedSignal = pyqtSignal(int, bool)

    def __init__(self):
        super().__init__()
        self.redValue = 0
        self.greenValue = 0
        self.blueValue = 0
        self.redShow = False
        self.greenShow = False
        self.blueShow = False
        self.col = QColor(0, 0, 0)
        self.step = 0
        self.timer = QBasicTimer()
        self.colorChangeSignal.connect(self.OnColorChange)
        self.colorIsSelectedSignal.connect(self.OnColorSelectedChange)
        self.initUI()

    def initUI(self):
        vlayoutOutSide = QVBoxLayout()
        hlayout = QHBoxLayout()
        vlayout = QVBoxLayout()
        vlayout.addLayout(self.singelModel("红色", 0))
        vlayout.addLayout(self.singelModel("绿色", 1))
        vlayout.addLayout(self.singelModel("蓝色", 2))
        vlayout.setSpacing(20)
        self.square = QFrame(self)
        self.square.setGeometry(150, 20, 100, 100)
        self.square.setStyleSheet("QWidget { background-color: %s }" % self.col.name())
        hlayout.addLayout(vlayout)
        hlayout.addWidget(self.square)
        vlayoutOutSide.addLayout(hlayout)  #第一层

        self.showCalendar()
        vlayoutOutSide.addWidget(self.calendar)
        # 进度条
        self.pbar = QProgressBar(self)
        self.timer.start(20, self)

        vlayoutOutSide.addWidget(self.pbar)
        vlayoutOutSide.addWidget(self.lbl)
        self.setLayout(vlayoutOutSide)
        self.setGeometry(300, 300, 500, 170)
        self.setWindowTitle('颜色混合器')
        self.show()

    def singelModel(self, name, index):

        def isShowSlider(press):
            if press:
                sld.setHidden(False)
            else:
                sld.setHidden(True)
        colorSignal = self.colorChangeSignal
        enableSignal = self.colorIsSelectedSignal

        def changeColor(value):
            colorSignal.emit(index, value)

        def colorChangeEnable(checked):
            enableSignal.emit(index, checked)

        vlayout = QVBoxLayout()
        hlayout = QHBoxLayout()
        btn = QPushButton(name)
        btn.setCheckable(True)
        btn.setMaximumSize(50, 50)
        btn.clicked.connect(colorChangeEnable)
        chechbox = QCheckBox('是否显示细节条', self)
        chechbox.toggle()
        chechbox.setCheckState(Qt.CheckState.Unchecked)
        chechbox.stateChanged.connect(isShowSlider)
        sld = QSlider(Qt.Horizontal, self)
        sld.setFocusPolicy(Qt.NoFocus)
        sld.setMaximumSize(250, 10)
        sld.setHidden(True)
        sld.valueChanged.connect(changeColor)
        hlayout.setSpacing(50)
        hlayout.addWidget(btn)
        hlayout.addWidget(chechbox)
        vlayout.setSpacing(0)
        vlayout.addLayout(hlayout)
        vlayout.addWidget(sld)
        return vlayout

    def OnColorChange(self, index, value):
        color = int(value/100*255)
        if index == 0:
            if self.redShow is True:
                self.col.setRed(color)
            else:
                self.col.setRed(0)
        elif index == 1:
            if self.greenShow is True:
                self.col.setGreen(color)
            else:
                self.col.setGreen(0)
        else:
            if self.blueShow is True:
                self.col.setBlue(color)
            else:
                self.col.setGreen(0)
        self.square.setStyleSheet("QFrame { background-color: %s }" % self.col.name())

    def OnColorSelectedChange(self, index, canShow):
        if index == 0:
            self.redShow = canShow
            if canShow is False:
                self.col.setRed(0)
        elif index == 1:
            self.greenShow = canShow
            if canShow is False:
                self.col.setGreen(0)
        else:
            self.blueShow = canShow
            if canShow is False:
                self.col.setBlue(0)
        self.square.setStyleSheet("QFrame { background-color: %s }" % self.col.name())

    def showCalendar(self):
        # 日历
        self.calendar = QCalendarWidget(self)
        self.calendar.setGridVisible(True)
        self.calendar.clicked.connect(self.showDate)
        # calendar.setSelectedDate(datetime.date)
        self.lbl = QLabel(self)
        date = self.calendar.selectedDate()
        self.lbl.setText("当前时间: %s" % date.toString())

    def timerEvent(self, e):

        if self.step >= 100:
            self.step = 0
            self.calendar.showNextMonth()
            return

        self.step = self.step + 1
        self.pbar.setValue(self.step)

    def showDate(self, date):
        self.lbl.setText("当前时间: %s" % date.toString())


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

代码的难度不高,这里就不做详细解释了,可能要注意以下的就是下图这部分的代码
在这里插入图片描述
也就是singelModel这个函数,为了多次调用不写重复代码,并且能让事件发出来,用了pyqtSignal作为事件传播

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/weixin_40301728/article/details/111063292

pyqt5 使用pyinstaller生成.exe可执行文件-爱代码爱编程

1. 生成.exe可执行文件 需要安装的库函数: 1. wxPython 2. pywin32 3. tornado 4. ipykernel 5. pyinstaller 1. 在命令行进入要生成.exe的项目目录 2. 按顺序输入以下命令: chcp 65001 pyinstaller -F

实战PyQt5: 110-QSS样式表之基本语法-爱代码爱编程

QSS样式表简介 在Qt中,提供了一种叫做Qt样式表(简称QSS)的自定义控件外观机制,QSS的思想很大程度上是来自于HTML的层叠式样式表(CSS), 它大量参考了CSS的内容,其语法也和CSS类似,使用QSS可以使界面美化部分和代码层分开,可以在不修改代码的情况下改变应用的外观显示,这种分离的方式大大方便了应用的开发维护。 通过调用QWidget.

实战PyQt5: 109-将应用最小化到托盘-爱代码爱编程

应用最小化到托盘 现代操作系统通常在桌面上提供一个特殊区域,称为系统托盘或通知区域。对一个GUI程序,如果在最小化时,程序做任务栏消失或者点击关闭按钮时,应用并不关闭,而是在系统托盘上显示一个图标,来表示该程序仍在运行,在托盘上打开上下文菜单,可以恢复程序正常显示,或者完全退出应用等操作。 要实现一个具有最小化到托盘功能的程序,要使用到类QSystem

(2)pyqt5教程--->使用QTdesigner实现界面代码分离-爱代码爱编程

GitHub连接:本专栏所有源代码的GitHub直通车 在上一篇中已经讲了一个pyqt5的基本框架是什么,这篇使用QTdesigner来设计一下界面第一篇:pyqt5的基本框架 1、QTdesigner QTdesigner是一个GUI可视化设计软件,我就没有在Python的那个pyqt5 tools里面下,我是通过安装QT5.9.8来获得的,因为后

(3)pyqt5教程--->信号与槽初试-爱代码爱编程

GitHub连接:本专栏所有源代码的GitHub直通车 上一篇已经讲了如何使用QTdesigner生成ui文件并转化为py文件,最终实现界面代码分离的效果 信号与槽作是 QT 的核心机制,是一种高级接口,应用于对象之间的通信,它是 QT 的核心特性,也是 QT 区别于其它工具包的重要地方。它为高层次的事件处理自动生成所需要的附加代码。例如在tkinte

Qt实现一个支持QSS的Switch Button(开关按钮)-爱代码爱编程

目录 Qt实现一个支持QSS的Switch Button(开关按钮)问题解决思路实现方式其他不同的 Switch Button总结 Qt实现一个支持QSS的Switch Button(开关按钮) 本文会比较长,目的是为了提供一种实现自定义复杂控件的方式,对于使用 QSS 应用样式的项目可能会有帮助。 实现的过程会相对比较复杂和难理解,仅作为

Qt进阶-事件过滤器eventFilter的使用-爱代码爱编程

事件过滤器eventFilter的使用 如果不提升控件,可以在控件的父对象中为控件安装事件过滤器,从而在父对象中处理子控件的事件; 在父对象源文件中: //为控件安装事件过滤器 ui.pushButton->installEventFilter(this); ui.pushButton_2->installEventFilter

8.QML Qt Quick Controls 2中常用的界面形式——堆叠式界面(StackView)-爱代码爱编程

堆叠式界面的实现的核心组件就是StackView。StackView是一个基于栈的导航浏览模型,可以与一组关联的页面一起使用。当用户浏览深层页面时,深层页面被推到栈顶,当用户选择返回时,之前浏览的页面会再次弹出。 堆叠式界面的效果 上述演示中,界面一共有四个:分别是home、profile、about和editprofile 上述四个界面中使用的

Qt+OpenCV发布可执行程序(打包DLL文件)-爱代码爱编程

一、目的         OpenCV是最常用的开源视觉库,Qt是当前最常用的GUI开发框架,用他们做出的软件如果要在其他终端运行就需要提前打包,将依赖的环境连同程序一起打包成可执行文件,这里是使用添加DLL文件的方式,做出绿色版可执行文件,通过U盘直接将生成程序拷到其他电脑上可以直接使用。   二、解决方法 2.1 生成exe文件      

QT自定义继承控件类添加信号和槽-爱代码爱编程

QT自定义继承控件类添加信号和槽 原因:在使用QT comboBox控件时发现没有点击事件(clicked()),翻阅博客查找到此类解决办法,本文介绍使用QTcreator中ui设计直接生成信号对应槽的方法,不用在程序内使用connect函数联系信号和槽的方式,前一种在参考博客评论区有大神提到,后一种方法在参考博客中有具体介绍,特以为记。 方法总结

使用QSharedMemory进行程序内存管理-爱代码爱编程

QSharedMemory 共享内存处理类 这个类的功能是挺强大的,本次只记录这个类的另一种用法。 通过创建共享内存,用共享内存的方式,防止程序多次启动。 在main.cpp中加入以下代码,可防止程序多次启动:   QSharedMemory *shareMem = new QSharedMemory(QString("xxxName"));