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.hqwc.cn/news/214129.html

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

相关文章

云安全之盾:ZStack 云主机安全防护解决方案全方位保护云环境

随着云计算的蓬勃发展&#xff0c;网络威胁愈发复杂&#xff0c;涵盖了从勒索病毒到APT攻击的各种威胁类型。在这一风云变幻的网络安全环境下&#xff0c;云主机安全不再仅仅是一个选项&#xff0c;它是信息系统安全的核心要素。云轴科技ZStack 云主机安全防护解决方案是为了满…

局域网协议:动态主机配置协议(Dynamic Host Configuration Protocol,DHCP)

在局域网络中&#xff0c;DHCP协议通过自动化和简化网络配置过程&#xff0c;提高网络的可管理性和灵活性&#xff0c;使得设备可以更轻松地连接到网络并获得所需的网络配置信息。 文章目录 What is DHCP?DHCP的组成1. DHCP客户端2. DHCP服务器&#xff1a;3. 中继代理&#…

OpenAI研发神秘“Q*”模型:科学家认输,AI赢了人类关键一战

图片来源&#xff1a;视觉中国 作者丨叶蓁 编辑丨康晓 出品丨深网腾讯新闻小满工作室 在山姆奥特曼&#xff08;Sam Altman&#xff09;被OpenAI前董事会突然罢免之前&#xff0c;数位研究人员向董事会发送了一封信&#xff0c;警告称他们发现了一种能够威胁到人类的强大人工…

Jenkins Ansible 参数构建

首先在Jenkins中创建自由项目 在web端配置完成后在另一台机子上下载nginx 在gitlab端创建项目并创建文件配置代码 在有Jenkins的机器上下载Ansible [rootslave1 ~]# yum -y install epel-release [rootslave1 ~]# yum -y install ansible再进入下载nginx机器中克隆gitlab项目…

【linux】服务器CPU占用50%,top/htop/ps却看不到异常进程?使用unhide可以查看!

问题描述 htop发现前32个核全被占满了&#xff0c;但是却找不到对应进程号 查杀 安装unhide查看隐藏进程 apt-get install unhideunhide使用 unhide proc果然发现了隐藏进程 治标&#xff1a;杀死隐藏进程 kill -9 [pid]这么多pid号&#xff0c;我这边杀了其中一个&am…

麒麟KYSEC使用方法05-命令设置密码强度

原文链接&#xff1a;麒麟KYSEC使用方法05-命令设置密码强度 hello&#xff0c;大家好啊&#xff0c;今天给大家带来麒麟KYLINOS的kysec使用方法系列文章第五篇内容----使用命令设置密码强度&#xff0c;密码强度策略有两个文件需要修改&#xff0c;pwquality.conf/login.defs&…

如何在Simulink中使用syms?换个思路解决报错:Function ‘syms‘ not supported for code generation.

问题描述 在Simulink中的User defined function使用syms函数&#xff0c;报错simulink无法使用外部函数。 具体来说&#xff1a; 我想在Predefined function定义如下符号函数作为输入信号&#xff0c;在后续模块传入函数参数赋值&#xff0c;以实现一次定义多次使用&#xf…

“java.lang.IllegalStateException: No ConfigurableListableBeanFactory set“,缺少配置

一、错误分析 做品优购项目的运营商安全登录时&#xff0c;运行项目后&#xff0c;浏览器访问模板页&#xff0c;模板页的表格无法正常显示&#xff0c;报错信息如下&#xff1a; SEVERE: StandardWrapper.Throwable java.lang.IllegalStateException: No ConfigurableLista…

JMeter测试报错422 Unprocessable Entity

添加HTTP信息头&#xff1a; ​ HTTP请求-》添加-〉配置元件-》HTTP信息头管理器 ​ 如果需要送json&#xff0c;需要添加Content-Type:application/json&#xff0c;否则会报【422 Unprocessable Entity】

PSP - 从头搭建 抗原类别 (GPCR) 的 蛋白质结构预测 项目流程

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/134595717 GPCRs&#xff08;G Protein-Coupled Receptors&#xff0c;G蛋白偶联受体&#xff09;&#xff0c;又称为7次跨膜受体&#xff0c;是细…

新苹果手机如何导入旧手机数据?解决方案来了,记得收藏!

为了保持其竞争优势&#xff0c;苹果公司不断推出新的产品和服务&#xff0c;因此苹果手机的更新换代速度是比较快的。正巧最近刚出了iPhone15&#xff0c;相信很多小伙伴已经换上了期待已久的新手机。 更换新手机后&#xff0c;大家都会面临一个问题&#xff1a;新苹果手机如…

让工作效率提升10倍:十大AIGC工具评测【建议收藏】

AI技术的普及已经在近年来不断增长。这种技术已经改变了我们与电脑的互动方式&#xff0c;让我们能够更高效、更自然地完成任务。本文将展示10个基于ChatGPT、GPT-3.5和 GPT-4.0 AI模型构建的最强大的资源&#xff0c;使您更容易充分利用它们的潜力。因此&#xff0c;如果您想利…