PyQt5 按钮Button 添加事件(信号/槽)

2023-11-16

本文基于PyQt5 按钮Buttons样式设计,针对按钮添加响应的点击事件触发。

效果截图:

PyQt 模型设计:

 PyQt 设计器截图:

*.UI 源码

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>800</width>
    <height>600</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <widget class="QWidget" name="horizontalLayoutWidget">
    <property name="geometry">
     <rect>
      <x>20</x>
      <y>30</y>
      <width>478</width>
      <height>80</height>
     </rect>
    </property>
    <layout class="QHBoxLayout" name="horizontalLayout">
     <item>
      <widget class="QPushButton" name="pushButton_5">
       <property name="minimumSize">
        <size>
         <width>0</width>
         <height>48</height>
        </size>
       </property>
       <property name="text">
        <string>PushButton</string>
       </property>
      </widget>
     </item>
     <item>
      <widget class="QPushButton" name="pushButton_4">
       <property name="minimumSize">
        <size>
         <width>0</width>
         <height>48</height>
        </size>
       </property>
       <property name="text">
        <string>PushButton</string>
       </property>
      </widget>
     </item>
     <item>
      <widget class="QPushButton" name="pushButton_3">
       <property name="minimumSize">
        <size>
         <width>0</width>
         <height>48</height>
        </size>
       </property>
       <property name="text">
        <string>PushButton</string>
       </property>
      </widget>
     </item>
     <item>
      <widget class="QPushButton" name="pushButton_2">
       <property name="minimumSize">
        <size>
         <width>0</width>
         <height>48</height>
        </size>
       </property>
       <property name="text">
        <string>PushButton</string>
       </property>
      </widget>
     </item>
     <item>
      <widget class="QPushButton" name="pushButton">
       <property name="minimumSize">
        <size>
         <width>0</width>
         <height>48</height>
        </size>
       </property>
       <property name="text">
        <string>PushButton</string>
       </property>
      </widget>
     </item>
    </layout>
   </widget>
   <widget class="QWidget" name="horizontalLayoutWidget_2">
    <property name="geometry">
     <rect>
      <x>20</x>
      <y>110</y>
      <width>478</width>
      <height>80</height>
     </rect>
    </property>
    <layout class="QHBoxLayout" name="horizontalLayout_2">
     <item>
      <widget class="QPlainTextEdit" name="plainTextEdit"/>
     </item>
    </layout>
   </widget>
  </widget>
 </widget>
 <resources/>
 <connections>
  <connection>
   <sender>pushButton</sender>
   <signal>clicked()</signal>
   <receiver>plainTextEdit</receiver>
   <slot>zoomIn()</slot>
   <hints>
    <hint type="sourcelabel">
     <x>362</x>
     <y>39</y>
    </hint>
    <hint type="destinationlabel">
     <x>258</x>
     <y>149</y>
    </hint>
   </hints>
  </connection>
  <connection>
   <sender>pushButton_2</sender>
   <signal>clicked()</signal>
   <receiver>plainTextEdit</receiver>
   <slot>zoomIn()</slot>
   <hints>
    <hint type="sourcelabel">
     <x>355</x>
     <y>69</y>
    </hint>
    <hint type="destinationlabel">
     <x>258</x>
     <y>149</y>
    </hint>
   </hints>
  </connection>
  <connection>
   <sender>pushButton_3</sender>
   <signal>clicked()</signal>
   <receiver>plainTextEdit</receiver>
   <slot>zoomIn()</slot>
   <hints>
    <hint type="sourcelabel">
     <x>258</x>
     <y>69</y>
    </hint>
    <hint type="destinationlabel">
     <x>258</x>
     <y>149</y>
    </hint>
   </hints>
  </connection>
  <connection>
   <sender>pushButton_4</sender>
   <signal>clicked()</signal>
   <receiver>plainTextEdit</receiver>
   <slot>zoomIn()</slot>
   <hints>
    <hint type="sourcelabel">
     <x>162</x>
     <y>69</y>
    </hint>
    <hint type="destinationlabel">
     <x>258</x>
     <y>149</y>
    </hint>
   </hints>
  </connection>
  <connection>
   <sender>pushButton_5</sender>
   <signal>clicked()</signal>
   <receiver>plainTextEdit</receiver>
   <slot>zoomIn()</slot>
   <hints>
    <hint type="sourcelabel">
     <x>65</x>
     <y>69</y>
    </hint>
    <hint type="destinationlabel">
     <x>258</x>
     <y>149</y>
    </hint>
   </hints>
  </connection>
 </connections>
</ui>

*.UI 源码 转换为*.py

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'untitled2.ui'
#
# Created by: PyQt5 UI code generator 5.15.4
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.
import sys

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QApplication, QMainWindow

StyleSheet = """
/*这里是通用设置,所有按钮都有效,不过后面的可以覆盖这个*/
QPushButton {
    border: none; /*去掉边框*/
}
/*
QPushButton#xxx
或者
#xx
都表示通过设置的objectName来指定
*/
QPushButton#pushButton {
    background-color: #f44336; /*背景颜色*/
}
#pushButton:hover {
    background-color: #e57373; /*鼠标悬停时背景颜色*/
}
/*注意pressed一定要放在hover的后面,否则没有效果*/
#pushButton:pressed {
    background-color: #ffcdd2; /*鼠标按下不放时背景颜色*/
}
#pushButton_2 {
    background-color: #4caf50;
    border-radius: 5px; /*圆角*/
}
#pushButton_2:hover {
    background-color: #81c784;
}
#pushButton_2:pressed {
    background-color: #c8e6c9;
}
#pushButton_3 {
    background-color: #2196f3;
    /*限制最小最大尺寸*/
    min-width: 96px;
    max-width: 96px;
    min-height: 96px;
    max-height: 96px;
    border-radius: 48px; /*圆形*/
}
#pushButton_3:hover {
    background-color: #64b5f6;
}
#pushButton_3:pressed {
    background-color: #bbdefb;
}
#pushButton_4 {
    max-height: 48px;
    border-top-right-radius: 20px; /*右上角圆角*/
    border-bottom-left-radius: 20px; /*左下角圆角*/
    background-color: #ff9800;
}
#pushButton_4:hover {
    background-color: #ffb74d;
}
#pushButton_4:pressed {
    background-color: #ffe0b2;
}
/*根据文字内容来区分按钮,同理还可以根据其它属性来区分*/
#pushButton_5 {
    color: white; /*文字颜色*/
    background-color: #9c27b0;
}
"""


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 600)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.horizontalLayoutWidget = QtWidgets.QWidget(self.centralwidget)
        self.horizontalLayoutWidget.setGeometry(QtCore.QRect(20, 30, 478, 80))
        self.horizontalLayoutWidget.setObjectName("horizontalLayoutWidget")
        self.horizontalLayout = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget)
        self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.pushButton_5 = QtWidgets.QPushButton(self.horizontalLayoutWidget)
        self.pushButton_5.setMinimumSize(QtCore.QSize(0, 48))
        self.pushButton_5.setObjectName("pushButton_5")
        self.horizontalLayout.addWidget(self.pushButton_5)
        self.pushButton_4 = QtWidgets.QPushButton(self.horizontalLayoutWidget)
        self.pushButton_4.setMinimumSize(QtCore.QSize(0, 48))
        self.pushButton_4.setObjectName("pushButton_4")
        self.horizontalLayout.addWidget(self.pushButton_4)
        self.pushButton_3 = QtWidgets.QPushButton(self.horizontalLayoutWidget)
        self.pushButton_3.setMinimumSize(QtCore.QSize(0, 48))
        self.pushButton_3.setObjectName("pushButton_3")
        self.horizontalLayout.addWidget(self.pushButton_3)
        self.pushButton_2 = QtWidgets.QPushButton(self.horizontalLayoutWidget)
        self.pushButton_2.setMinimumSize(QtCore.QSize(0, 48))
        self.pushButton_2.setObjectName("pushButton_2")
        self.horizontalLayout.addWidget(self.pushButton_2)
        self.pushButton = QtWidgets.QPushButton(self.horizontalLayoutWidget)
        self.pushButton.setMinimumSize(QtCore.QSize(0, 48))
        self.pushButton.setObjectName("pushButton")
        self.horizontalLayout.addWidget(self.pushButton)
        self.horizontalLayoutWidget_2 = QtWidgets.QWidget(self.centralwidget)
        self.horizontalLayoutWidget_2.setGeometry(QtCore.QRect(20, 110, 478, 80))
        self.horizontalLayoutWidget_2.setObjectName("horizontalLayoutWidget_2")
        self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget_2)
        self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0)
        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
        self.plainTextEdit = QtWidgets.QPlainTextEdit(self.horizontalLayoutWidget_2)
        self.plainTextEdit.setObjectName("plainTextEdit")
        self.horizontalLayout_2.addWidget(self.plainTextEdit)
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)
        # Qt Designer 设计器自动生成相关事件代码(信号/槽)
        # self.pushButton.clicked.connect(self.plainTextEdit.zoomIn)
        # self.pushButton_2.clicked.connect(self.plainTextEdit.zoomIn)
        # self.pushButton_3.clicked.connect(self.plainTextEdit.zoomIn)
        # self.pushButton_4.clicked.connect(self.plainTextEdit.zoomIn)
        # self.pushButton_5.clicked.connect(self.plainTextEdit.zoomIn)
        # 自定义函数进行相关(信号/槽)事件绑定
        self.pushButton.clicked.connect(self.onClicked)
        self.pushButton_2.clicked.connect(self.onPressed)
        self.pushButton_3.clicked.connect(self.onReleased)
        self.pushButton_4.clicked.connect(self.onToggled)
        self.pushButton_5.clicked.connect(self.onToggled)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.pushButton_5.setText(_translate("MainWindow", "PushButton"))
        self.pushButton_4.setText(_translate("MainWindow", "PushButton"))
        self.pushButton_3.setText(_translate("MainWindow", "PushButton"))
        self.pushButton_2.setText(_translate("MainWindow", "PushButton"))
        self.pushButton.setText(_translate("MainWindow", "PushButton"))

    # 自定义按钮点击触发事件
    def onClicked(self):
        self.plainTextEdit.appendPlainText(
            '按钮{0}被点击'.format(self.pushButton.objectName()))

    def onPressed(self):
        self.plainTextEdit.appendPlainText(
            '按钮{0}被按下'.format(self.pushButton_2.objectName()))

    def onReleased(self):
        self.plainTextEdit.appendPlainText(
            '按钮{0}被释放'.format(self.pushButton_3.objectName()))

    def onToggled(self, checked):
        self.plainTextEdit.appendPlainText(
            '按钮{0}被选中:{1}'.format(self.pushButton_4.objectName(), checked))


if __name__ == '__main__':
    app = QApplication(sys.argv)
    app.setStyleSheet(StyleSheet)
    MainWindow = QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

 重点:

1、通过组件的ObjectName + 应用app的setStyleSheet(StyleSheet) 实现自定义样式绑定

2、通过组件的Clicked.connect() 绑定自定义函数。

        # 自定义函数进行相关(信号/槽)事件绑定
        self.pushButton.clicked.connect(self.onClicked)  # pushButton 绑定onClicked 函数
        self.pushButton_2.clicked.connect(self.onPressed)# pushButton_2绑定onPressed函数
        self.pushButton_3.clicked.connect(self.onReleased)# pushButton_3绑定onReleased函数
        self.pushButton_4.clicked.connect(self.onToggled)# pushButton_4绑定onToggled函数
        self.pushButton_5.clicked.connect(self.onToggled)# pushButton_5 绑定onToggled函数

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PyQt5 按钮Button 添加事件(信号/槽) 的相关文章

随机推荐

  • 操作系统 --- 进程/线程 同步

    操作系统 进程 线程 同步 资源竞争 race condition 临界区 critical section 解决临界区问题 实现进程同步 进程同步的三个原则 互斥 mutual exclusive 有限等待 bounded waiting
  • Basic Level 1024 科学计数法 (20分)

    题目 科学计数法是科学家用来表示很大或很小的数字的一种方便的方法 其满足正则表达式 1 9 0 9 E 0 9 即数字的整数部分只有 1 位 小数部分至少有 1 位 该数字及其指数部分的正负号即使对正数也必定明确给出 现以科学计数法的格式给
  • java agent技术原理及简单实现

    注 本文定义 在函数执行前后增加对应的逻辑的操作统称为MOCK 1 引子 在某天与QA同学进行沟通时 发现QA同学有针对某个方法调用时 有让该方法停止一段时间的需求 我对这部分的功能实现非常好奇 因此决定对原理进行一些深入的了解 力争找到一
  • 循环和数据的操作命令

    while循环的本质就是让计算机在满足某一条件的前提下去重复做同一件事情 即while循环为条件循环 包含 1 条件计数循环 2条件无限循环 1 1计数循环 count 0 while count lt 9 print the loop i
  • Vue前端框架

    一 简介 Vue是一个渐进式 真正用到才引用 的JavaScript框架与其它大型框架不同的是 Vue 被设计为可以自底向上逐层应用 Vue 的核心库只关注视图层 不仅易于上手 还便于与第三方库或既有项目整合 另一方面 与现代化的工具以及各
  • Android相机调用-CameraX【外接摄像头】【USB摄像头】

    Android相机调用有原生的Camera和Camera2 我觉得调用代码都太复杂了 CameraX调用代码简洁很多 说明文档 https developer android com jetpack androidx releases ca
  • 一文弄懂c/c++编译过程(预处理,编译,汇编,链接)

    目录 1 为什么要编译 2 编译过程 3 实验验证 1 为什么要编译 c语言是一门高级语言 需要编译器将其转换成计算机能理解的机器语言 才能在计算机上执行 编译的过程就是将c语言代码转换成汇编代码文件的过程 2 编译过程 程序从代码编译成可
  • 关于时间序列分析的协整检验、脉冲响应图、方差分解图和格兰杰因果检验

    1 关于时间序列中分的析过程 step1 单位根检验 一般来说 时间序列进行分析之前应该先检验是否存在单位根 如是 则需要进行差分转换 否则可以直接进行var vector autoregression 这里不讨论arma Autoregr
  • 【mysql】mysql启动关闭命令以及一些报错解决问题

    mysql启动关闭命令以及一些报错解决问题 1 利用cmd窗口启动mysql出现服务名无效 2 启动mysql出现发生系统错误 5 1 利用cmd窗口启动mysql出现服务名无效 利用net start mysql启动mysql报错 服务名
  • Vue如何实现权限管理

    一 权限管理 权限管理就是让不同的用户只能访问自己权限内的资源 有以下几种 路由权限 用户登录后只能看到自己权限内的导航菜单 且只能访问自己权限内的路由地址 视图权限 用户只能看到自己权限内的内容和按钮 请求权限 越权请求将其拦截 二 控制
  • 云原生之使用Docker部署h5ai文件展示页

    云原生之使用Docker部署h5ai文件展示页 一 h5ai介绍 二 检查本地docker服务 1 检查系统docker状态 2 检查docker版本 三 下载h5ai镜像 四 部署h5ai服务 1 创建数据挂载目录 2 创建h5ai容器
  • ajax中XMLHttpRequest对象详解

    ajax中XMLHttpRequest对象详解 ajax技术的核心或者说负责ajax进行同步或者异步服务器请求是XMLHttpRequest对象 在用使用ajax技术时 其实就是操作XMLHttpRequest进行相应的业务 方法 1创建X
  • Mybatis item 和 index 区别

    Mybatis item 和 index 区别 相信很多人多看过Mybatis官方文档 但是在文档中并没有详细的说明index 的详细讲解 这里废话不多说 直接上代码来分析它和item 的区别
  • vue项目运行报错:error ‘v-model‘ directives require no argument vue/valid-v-model

    在vue项目中 需要引用第三方库 比如vant 2 12 47 在使用Dialog弹出框组件 需要使用v model show来确定是否显示弹窗 在项目运行时 会报错 error v model directives require no
  • 游戏服务器显示异常什么意思,游戏服务器状态异常怎么解决办法

    游戏服务器状态异常怎么解决办法 内容精选 换一换 GAUSS 00701 cannot rename inherited constraint s SQLSTATE 42P16错误原因 修改继承的约束名 解决办法 禁止修改继承的约束名 GA
  • gaussdb mysql对比_GaussDB(for MySQL)

    GaussDB for MySQL 是华为自研的最新一代高性能企业级分布式数据库 完全兼容MySQL 基于华为最新一代DFV分布式存储 采用计算存储分离架构 最高支持128TB的海量存储 可实现超百万级QPS吞吐 支持跨AZ部署 数据0丢失
  • Macronix MX25L25645G NOR Flash无法擦除问题分析

    1 问题现象描述 处理器使用的 SAM9X60 使用的内核版本是 5 10 80 在调试 Macronix MX25L25645G NOR Flash时 发现flash驱动加载成功后 使用 mtd debug 工具 erase flash时
  • Python期末考试答案

    文章目录 一 选择题 和 的区别 列表的操作 字典 字符串 运算 类的继承 程序阅读题 二 判断题 三 简答题 在python中 递归函数的特性是什么 阐释python是什么样的一门编程语言及应用场景 阐述类的三大特性是什么 你是如何理解的
  • 用Python的pandas读取excel文件中的数据

    一 前言 hello呀 各位铁子们大家好呀 今天呢来和大家聊一聊用Python的pandas读取excel文件中的数据 二 读取Excel文件 使用pandas的read excel 方法 可通过文件路径直接读取 注意到 在一个excel文
  • PyQt5 按钮Button 添加事件(信号/槽)

    本文基于PyQt5 按钮Buttons样式设计 针对按钮添加响应的点击事件触发 效果截图 PyQt 模型设计 PyQt 设计器截图 UI 源码