PyQt基础_004_ 按钮类控件QPushButton以及自定义按钮控件

Qpushbutton基本操作  
1.热键
2.按钮加图标
3.按钮事件等

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *class Form(QDialog):def __init__(self, parent=None):super(Form, self).__init__(parent)layout = QVBoxLayout()self.btn1 = QPushButton("Button1")self.btn1.setCheckable(True)self.btn1.toggle()self.btn1.clicked.connect(lambda:self.whichbtn(self.btn1) )self.btn1.clicked.connect(self.btnstate)layout.addWidget(self.btn1)self.btn2 = QPushButton('image')self.btn2.setIcon(QIcon(QPixmap(r'./resource/github.png')))self.btn2.clicked.connect(lambda:self.whichbtn(self.btn2) )layout.addWidget(self.btn2)self.setLayout(layout) self.btn3 = QPushButton("Disabled")self.btn3.setEnabled(False)layout.addWidget(self.btn3)self.btn4= QPushButton("&Download")self.btn4.setDefault(True)self.btn4.clicked.connect(lambda:self.whichbtn(self.btn4))layout.addWidget(self.btn4)self.setWindowTitle("Button demo")def btnstate(self):if self.btn1.isChecked():print("button pressed" ) else:print("button released" ) def whichbtn(self,btn):print("clicked button is " + btn.text() ) if __name__ == '__main__':app = QApplication(sys.argv)btnDemo = Form()btnDemo.show()
sys.exit(app.exec_())

追踪按钮事件,按钮被按下,并告知函数哪个按钮被按下了


from PyQt5.QtWidgets import QMainWindow, QPushButton , QWidget , QMessageBox, QApplication, QHBoxLayout
import sys 
from functools import partialclass WinForm(QMainWindow): def __init__(self, parent=None): super(WinForm, self).__init__(parent) self.setWindowTitle("信号和槽传递额外参数例子")button1 = QPushButton('Button 1') button2 = QPushButton('Button 2') button1.clicked.connect(partial(self.onButtonClick, 1)) button2.clicked.connect(partial(self.onButtonClick, 2))layout = QHBoxLayout() layout.addWidget(button1) layout.addWidget(button2) main_frame = QWidget() main_frame.setLayout(layout) self.setCentralWidget(main_frame) def onButtonClick(self, n): print('Button {0} 被按下了'.format(n)) QMessageBox.information(self, "信息提示框", 'Button {0} clicked'.format(n))if __name__ == "__main__": app = QApplication(sys.argv) form = WinForm()form.show() sys.exit(app.exec_())

自定义按钮形状

import sysfrom PyQt5.Qt import *# 1. 创建一个应用程序对象
app = QApplication(sys.argv)# 2.控件的操作
# 2.1创建控件
window = QWidget()
# 2.2设置控件window.setWindowTitle("QAbstractButton")
window.resize(500, 500)
window.move(400, 250)class Btn(QAbstractButton):"""自定义的按钮控件,体验从按钮抽象基类继承"""def paintEvent(self, evt) -> None:painter = QPainter(self) # 创建一个画家;告诉画在什么地方pen = QPen(QColor(20, 154, 151), 5) # 创建并设置一个笔painter.setPen(pen) # 把笔给画家painter.drawText(30, 30, self.text()) # 把按钮文字画在按钮上painter.drawEllipse(0, 0, 100, 120) # 画个椭圆btn = Btn(window)
btn.setText("ABC")
btn.resize(110, 150)btn.clicked.connect(lambda: print("点击了这个按钮")) # 按钮被按下则执行里面的lambda函数(槽函数)# 2.3展示控件
window.show()# 3.应用程序的执行, 进入到消息循环
sys.exit(app.exec_())

为按钮添加图标,自动重复等

import sysfrom PyQt5.Qt import *app = QApplication(sys.argv)window = QWidget()
window.setWindowTitle("按钮的功能测试")
window.resize(500, 500)
window.move(400, 250)btn = QPushButton(window)btn.setText("1")def plus_one():num = str(int(btn.text()) + 1)btn.setText(num)btn.pressed.connect(plus_one)icon = QIcon("./resource/github.png") # 通过文件路径设置图标
size = QSize(40, 40) # 通过(int, int)设置图标大小
btn.setIcon(icon)
btn.setIconSize(size)btn.setAutoRepeat(True) # 启动自动重复
btn.setAutoRepeatDelay(1000) # 按住多长时间(毫米)之后才开始自动重复window.show()
sys.exit(app.exec_())

设置按钮点击的有效区域

import sysfrom PyQt5 import QtGui
from PyQt5.Qt import *app = QApplication(sys.argv)window = QWidget()window.setWindowTitle("QAbstractButton-点击有效区域")
window.resize(500, 500)
window.move(400, 250)class Btn(QPushButton):"""自定义的按钮类,重写hitButton方法来实现自定义按钮点击有效区域功能"""def hitButton(self, point) -> bool:circle_center_x = self.width() / 2circle_center_y = self.height() / 2hit_x = point.x()hit_y = point.y()distance = ((hit_x - circle_center_x) ** 2 + (hit_y - circle_center_y) ** 2) ** 0.5# print(distance)if distance < self.width() / 2:return Trueelse:return Falsedef paintEvent(self, a0: QtGui.QPaintEvent) -> None:"""重写父类方法,实现在按钮上画一个圆"""super().paintEvent(a0) # 实现父类方法的全部功能painter = QPainter(self)painter.setPen(QPen(QColor(0, 240, 240), 6))painter.drawEllipse(self.rect()) # 在按钮上绘制一个圆btn = Btn(window)
btn.setText("点击")
btn.resize(200, 200)
btn.move(100, 100)
btn.pressed.connect(lambda: print("按钮被点击了"))window.show()sys.exit(app.exec_())

右键菜单

import sysfrom PyQt5.Qt import *class Window(QWidget):def contextMenuEvent(self, a0: QContextMenuEvent) -> None:# print("展示菜单")menu = QMenu(self)new_action = QAction(QIcon("./resource/github.png"), "新建", menu)new_action.triggered.connect(lambda: print("新建文件"))menu.addAction(new_action)menu.exec_(a0.globalPos()) # 把位置(全局)传递# 1. 创建一个应用程序对象
app = QApplication(sys.argv)# 2.控件的操作
# 2.1创建控件
window = Window()
# 2.2设置控件window.setWindowTitle("右键菜单")
window.resize(500, 500)
window.move(400, 250)def show_menu(point):"""customContextMenuRequested 的槽函数"""# print("自定义上下文菜单", point)menu = QMenu(window)exit_action = QAction(QIcon("./resource/github.png"), "关闭", menu)exit_action.triggered.connect(lambda: exit())menu.addAction(exit_action)# 把相对控件的坐标 point 映射到全局位置dest_point = window.mapToGlobal(point)menu.exec_(dest_point) # 把位置(全局)传递window.setContextMenuPolicy(Qt.CustomContextMenu)
window.customContextMenuRequested.connect(show_menu)# 2.3展示控件
window.show()# 3.应用程序的执行, 进入到消息循环
sys.exit(app.exec_())

带描述的按钮

import sysfrom PyQt5.Qt import *"""QCommandLinkButton 继承自 QPushButton"""
# 1. 创建一个应用程序对象
app = QApplication(sys.argv)# 2.控件的操作
# 2.1创建控件
window = QWidget()
# 2.2设置控件window.setWindowTitle("QCommandLinkButton的使用")
window.resize(500, 500)
window.move(400, 250)btn = QCommandLinkButton("标题", "描述", window)
btn.setText("标题2")
btn.setDescription("这是描述2")
btn.setIcon(QIcon("./resource/github.png"))# 2.3展示控件
window.show()# 3.应用程序的执行, 进入到消息循环
sys.exit(app.exec_())

窗口的综合调整,创建一个无边框、半透明的窗口;自定义关闭、最大化、最小化三个按钮;实现能够点击用户区域拖动窗口

import sys
from PyQt5 import QtGui
from PyQt5.Qt import *
class Window(QWidget):def __init__(self, *args, **kwargs):super().__init__(*args, **kwargs)self.setWindowFlags(Qt.FramelessWindowHint) # 设置了无边框的 Flagself.setWindowOpacity(0.85) # 设置不透明度self.setWindowTitle("窗口综合案例")self.setWindowIcon(QIcon("./resource/github.png"))self.resize(500, 500)self.move(400, 240)self.top_margin = 1 # 三个按钮距离顶部的距离self.btn_w = 32 # 按钮宽度self.btn_h = 32 # 按钮高度self.setup_ui()def setup_ui(self):close_btn = QPushButton(self)self.close_btn = close_btn # 通过把局部变量存储为对象属性来实现跨方法使用close_btn.setIcon(QIcon("./resource/github.png"))close_btn.resize(self.btn_w, self.btn_h)max_btn = QPushButton(self)self.max_btn = max_btn # 通过把局部变量存储为对象属性来实现跨方法使用max_btn.setIcon(QIcon("./resource/github.png"))max_btn.resize(self.btn_w, self.btn_h)mini_btn = QPushButton(self)self.mini_btn = mini_btn # 通过把局部变量存储为对象属性来实现跨方法使用mini_btn.setIcon(QIcon("./resource/github.png"))mini_btn.resize(self.btn_w, self.btn_h)# 监听按钮,连接信号与槽close_btn.pressed.connect(lambda: self.close())mini_btn.pressed.connect(lambda: self.showMinimized())def max_normal():"""最大化/恢复 按钮的槽函数"""if self.isMaximized():max_btn.setIcon(QIcon("./resource/github.png"))self.label.setText("Hello World")self.label.setStyleSheet("font-size: 30px;")self.label.adjustSize()self.showNormal()else:self.label.setText("Life is short, use Python.")self.label.setStyleSheet("font-size: 40px;")self.label.adjustSize()self.showMaximized()max_btn.setIcon(QIcon("./resource/github.png"))max_btn.pressed.connect(max_normal)label = QLabel("Hello World", self)self.label = labellabel.setStyleSheet("font-size: 30px;")label.adjustSize()lab_x = int((self.width() - label.width()) / 2)lab_y = int((self.height() - label.height()) / 2)label.move(lab_x, lab_y)def resizeEvent(self, a0: QtGui.QResizeEvent) -> None:"""当窗口大小改变时,重新移动三个按钮的位置"""self.close_btn.move(self.width() - self.btn_w, self.top_margin)self.max_btn.move(self.width() - self.btn_w * 2, self.top_margin)self.mini_btn.move(self.width() - self.btn_w * 3, self.top_margin)self.label.move(int((self.width() - self.label.width()) / 2),int((self.height() - self.label.height()) / 2),)def mousePressEvent(self, evt):# print("鼠标按下")if evt.button() == Qt.LeftButton: # 仅在鼠标左键按下时可以拖动self.move_flag = True # 设置一个标记,确保只有在执行 mousePressEvent 之后才会执行 mouseMoveEvent# 确定两个点(鼠标第一次按下的点,窗口当前所在的原始点)self.mouse_x = evt.globalX()self.mouse_y = evt.globalY()# print(self.mouse_x, self.mouse_y)self.origen_x = self.x()self.origen_y = self.y()def mouseMoveEvent(self, evt) -> None:if self.move_flag:# print(evt.globalX(), evt.globalY())# 计算的是移动向量move_x = evt.globalX() - self.mouse_xmove_y = evt.globalY() - self.mouse_ydest_x = self.origen_x + move_xdest_y = self.origen_y + move_yself.move(dest_x, dest_y)def mouseReleaseEvent(self, a0: QtGui.QMouseEvent) -> None:self.move_flag = False # 鼠标释放后重置标记,避免无法释放拖动
app = QApplication(sys.argv)
# window = QWidget(flags=Qt.FramelessWindowHint) # (之前面向过程写法保留的一行)设置了无边框的 Flag
window = Window()
window.show()
sys.exit(app.exec_())

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

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

相关文章

Android 打包aar包含第三方aar 解决方案

Android 打包aar包含第三方aar 因项目需要&#xff0c;打包aar包含第三方aar&#xff0c;如果直接对module进行打包会产生一些问题。 * What went wrong: Direct local .aar file dependencies are not supported when building an AAR. The resulting AAR would be broken be…

如何将Postman API转换JMeter进行扩展

可扩展性 Postman测试无法扩展。如果您的集合中有很多请求&#xff0c;Postman / Newman将使用1个线程&#xff08;用户&#xff09;并按顺序执行这些请求&#xff0c;而不是使用多个线程并发执行。 性能测试能力 由于可扩展性限制&#xff0c;Postman不适合API性能测试。性…

力扣二叉树--总结篇(1)

前言 七天写了二十道题&#xff0c;前面感觉不错&#xff0c;后面越来越写不出来&#xff0c;刷题的心境和效果已然发生了变化。写个阶段总结&#xff0c;及时调整。 内容 先是二叉树的遍历 前序&#xff0c;中序&#xff0c;后序&#xff0c;即对应的递归&#xff0c;迭代…

visual studio 下的git

我这个是看视频笔记 YouTube : https://www.youtube.com/watch?vgkDASVE_Hdg 主要内容是&#xff1a;建立git 库&#xff0c; 保存commit&#xff0c; 建立分支 create branch, 合并分支merge branch,比较 diff&#xff0c;Revert ,history,delete branch, rename branch, t…

金融众筹模式系统源码 适合创业孵化机构+天使投资机构+投资基金会等 附带完整的搭建教程

随着互联网技术的发展和金融市场的开放&#xff0c;金融众筹模式逐渐成为一种新型的融资方式。这种模式通过互联网平台聚集大量投资者&#xff0c;共同参与到一个项目中&#xff0c;为项目提供资金支持&#xff0c;最终获得投资回报。今天罗峰给大家分享一款金融众筹模式系统源…

基于springboot实现学生成绩管理系统项目【项目源码+论文说明】

基于springboot实现学生成绩管理系统演示 摘要 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&am…

Spring框架学习 -- Bean的生命周期和作用域

目录 前言 案例 案例分析 作用域的定义 Bean对象的6种作用域 Singleton prototype 设置作用域 ​编辑延迟初始化 Spring的执行流程 Bean的生命周期 前言 我们可以类比一下普通变量的生命周期和作用域, 大多数变量的生命周期和作用域都被限定在了花括号内 {}, 除…

微信公众号快速接入大模型

今天找到一个可以快速将大模型接入公众号的方法&#xff0c;现在跟大家分享一下。 如何让微信公众号接入大模型文案创作能力&#xff0c;实现类似ChatGPT文案创作功能。方法其实很简单&#xff0c;只需打开地址“http://www.botaigc.cn:8900/mpauth”&#xff0c;用微信扫码即可…

根据商品ID获取淘宝数据接口|淘宝商品详情接口|淘宝关键词搜索商品列表接口|淘宝到手价接口|淘宝API接口

淘宝API接口可以运用到多种业务场景中&#xff0c;以下列举了一些主要的场景&#xff1a; 商品信息展示&#xff1a;通过调用淘宝API详情接口&#xff0c;可以获取商品的详细信息&#xff0c;如商品标题、价格、库存、销量、评价等数据。这些信息可以用于在自己的网站或应用程…

实时LCM的ImgPilot搭建部署

ImgPilot是具有实时潜在一致性模型&#xff08;LCM&#xff09;功能的图像试点 下载源码 GitHub - leptonai/imgpilot: Image pilot with the power of Real-Time Latent Consistency Modelhttps://github.com/leptonai/imgpilot安装前端web cd imgpilot npm install 安装…

C++初阶 | [六] 模板初阶

摘要&#xff1a;泛型编程&#xff0c;函数模板&#xff0c;类模板 使用函数重载虽然可以实现&#xff0c;但是有一下几个不好的地方&#xff1a; 重载的函数仅仅是类型不同&#xff0c;代码复用率比较低&#xff0c;只要有新类型出现时&#xff0c;就需要用户自己增加对应的函…

新手如何买卖基金,基金投资基础入门

一、教程描述 本套基金教程&#xff0c;大小2.50G&#xff0c;共有13个文件。 二、教程目录 第01课&#xff1a;基金入门&#xff0c;学会投资其实不难.mp4 第02课&#xff1a;基金分类&#xff0c;琳琅满目清清楚楚.mp4 第03课&#xff1a;以稳取胜&#xff0c;稳健基金稳…

Unity SRP 管线【第三讲:URP 光照】

3.2.3 以前属于Shader部分&#xff0c;Shader部分不进行讲解。 这里只涉及Unity内部管线的设置问题。 文章目录 3.2.3 向GPU发送灯光数据设置光源数据设置主光源设置额外点光源 Shader中的数据 3.2.3 向GPU发送灯光数据 在UniversalRenderPipeline.cs > RenderSingleCamera…

每日一题:LeetCode-105.从前序遍历与中序遍历构造二叉树

每日一题系列&#xff08;day 02&#xff09; 前言&#xff1a; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f50e…

【从浅识到熟知Linux】基本指令之基本权限

&#x1f388;归属专栏&#xff1a;从浅学到熟知Linux &#x1f697;个人主页&#xff1a;Jammingpro &#x1f41f;每日一句&#xff1a;用博客整理整理之前学过的知识&#xff0c;是个不错的选择。 文章前言&#xff1a;本文介绍Linux中的基本权限及相关指令用法并给出示例和…

什么是机器学习

前言 机器学习&#xff08;Machine Learning, ML&#xff09;是一个总称&#xff0c;用于解决由各位程序员自己基于 if-else 等规则开发算法而导致成本过高的问题&#xff0c;想要通过帮助机器 「发现」 它们 「自己」 解决问题的算法来解决 &#xff0c;而不需要程序员将所有…

ThinkPHP6.1 多应用模式的一些事儿

TP安装就不说了&#xff0c;直接从安装完成开始了。 安装多应用模式扩展 think-multi-app composer require topthink/think-multi-app删除 app 目录下的 controller 文件夹&#xff08;TP 是根据是否有这个文件夹来判断单应用模式还是多应用模式的&#xff09;。 创建应用 …

二分查找之红蓝二分查找

꒰˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之处请多多谅解&#xff0c;让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN …

毅速丨3D打印随形水路为何受到模具制造追捧

在模具制造行业中&#xff0c;随形水路镶件正逐渐成为一种革命性的技术&#xff0c;其提高冷却效率、优化产品设计、降低成本等优点&#xff0c;为模具制造带来了巨大的创新价值。 随形水路是一种根据产品形状定制的冷却水路&#xff0c;其镶件可以均匀地分布在模具的表面或内部…

JavaWeb学习(未完结)

文章目录 一、基本概念1.1 动态Web网站简介1.2 web应用程序1.3 静态web1.4 动态web 二、web服务器2.1 技术2.2 应用服务器2.3 安装 jdk8 三、Tomcat3.1 安装 Tomcat93.2 文件说明3.3 启动并使用Tomcat3.4 关闭Tomcat3.5 可能遇到的问题3.6 配置3.6.1 修改测试访问的网页地址3.6…