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 partial

class 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 sys

from 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 sys

from 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 sys

from 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() / 2
        circle_center_y = self.height() / 2
        hit_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 True
        else:
            return False

    def 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 sys

from 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 sys

from 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) # 设置了无边框的 Flag
        self.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 = label
        label.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_x
            move_y = evt.globalY() - self.mouse_y
            dest_x = self.origen_x + move_x
            dest_y = self.origen_y + move_y
            self.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_())

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

万字长文 - Python 日志记录器logging 百科全书 - 高级配置之 日志文件配置

万字长文 - Python 日志记录器logging 百科全书 - 高级配置之 日志文件配置 前言 在 Python 的logging模块中&#xff0c;它不仅提供了基础的日志功能&#xff0c;还拥有一系列高级配置选项来满足复杂应用的日志管理需求。 说到logging 模块的高级配置&#xff0c;必须提及日…

模拟退火算法应用——求解函数的最小值

仅作自己学习使用 一、问题 需求&#xff1a; 计算函数 的极小值&#xff0c;其中个体x的维数n10&#xff0c;即x(x1,x2,…,x10)&#xff0c;其中每一个分量xi均需在[-20,20]内。因此可以知道&#xff0c;这个函数只有一个极小值点x (0,0,…,0)&#xff0c;且其极小值是0&…

STM32_7(ADC)

一、ADC ADC&#xff08;Analog-Digital Converter&#xff09;模拟-数字转换器ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量&#xff0c;建立模拟电路到数字电路的桥梁12位逐次逼近型ADC&#xff0c;1us转换时间输入电压范围&#xff1a;0~3.3V&#xff0c;…

蓝桥杯物联网竞赛_STM32L071_4_按键控制

原理图&#xff1a; 当按键S1按下PC14接GND&#xff0c;为低电平 CubMX配置: Keil配置&#xff1a; main函数&#xff1a; while (1){/* USER CODE END WHILE */OLED_ShowString(32, 0, "hello", 16);if(Function_KEY_S1Check() 1){ OLED_ShowString(16, 2, &quo…

HTTP/2:多路复用、服务器推送和首部压缩的革命

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

ES之x-pack-core-7.14.2许可证修改为白金版

X-Pack是什么 X-pack是elasticsearch的一个扩展包&#xff0c;将安全&#xff0c;警告&#xff0c;监视&#xff0c;图形和报告功能捆绑在一个易于安装的软件包中&#xff0c;虽然x-pack被设计为一个无缝的工作&#xff0c;但是你可以轻松的启用或者关闭一些功能。 主要分一下步…

基于Eclipse+Tomcat+Mysql开发的研究生信息教务系统

基于Eclipse的研究生教务系统 项目介绍&#x1f481;&#x1f3fb; 该研究生教务系统是一款集学生信息管理、学院信息维护、学生类别信息维护、专业信息维护、教师信息导入、课程信息导入及老师信息导入等功能于一体的教育管理软件。它以高效、便捷、准确的方式处理教务管理工作…

百度 文心一言 sdk 试用

JMaven Central: com.baidu.aip:java-sdk (sonatype.com) Java sdk地址如上&#xff1a; 文心一言开发者 文心一言 (baidu.com) ERNIE Bot SDK https://yiyan.baidu.com/developer/doc#Fllzznonw ERNIE Bot SDK提供便捷易用的接口&#xff0c;可以调用文心一言的能力&#…

DevEco Studio安装

HUAWEI DevEco Studio For OpenHarmony&#xff08;以下简称DevEco Studio&#xff09;是基于IntelliJ IDEA Community开源版本打造&#xff0c;面向OpenHarmony全场景多设备的一站式集成开发环境&#xff08;IDE&#xff09;&#xff0c;为开发者提供工程模板创建、开发、编译…

Markdown如何自定义字体样式:字体颜色、背景、斜体、粗体

Markdown如何自定义字体样式&#xff1a;字体颜色、背景、斜体、粗体 文章目录 Markdown如何自定义字体样式&#xff1a;字体颜色、背景、斜体、粗体前言一、字体大小二、字体颜色1. 英文字母2. 十六进制颜色值 三、字体背景色三、字体类型四、字体加粗五、字体斜体六、混合使用…

Mac Ubuntu双系统解决WiFi和WiFi 5G网络不可用问题

文章目录 设备信息1. Ubuntu WiFi不可用解决方式查看Mac的网卡型号根据网卡型号搜索获取到的解决方法查看WiFi名字问题参考链接 2. 解决WiFi重启后失效问题打开终端创建.sh脚本文件编辑脚本文件复制粘贴脚本修改脚本权限创建并编辑systemd service文件复制粘贴下文到systemd se…

Feign接口请求返回异常 no suitable HttpMessageConvert found for response type

问题场景&#xff1a; 后端调用feign接口请求, 接口返回异常, no suitable HttpMessageConvert found for response type 问题描述 报错异常如下&#xff1a; //根据图片特征 去查询人员信息ResultVo<List> personVos ipbdFaceLibPersonApi.queryFacePersonByFeatur…

Git 与 Maven:企业级版本管理与版本控制规范设计

一、背景 当今&#xff0c;许多开发人员熟悉 GitFlow 工作流程&#xff0c;但往往忽略了 GitFlow 如何与 Maven 版本控制结合&#xff0c;尤其是在管理 snapshot 和 release 版本时的最佳实践。本文旨在整合 GitFlow 工作流程与 Maven 版本管理&#xff0c;提出一个统一的企业…

Python 在 JMeter 中如何使用?

要在JMeter中使用Python&#xff0c;需要使用JSR223 Sampler元素来执行Python脚本。使用JSR223 Sampler执行Python脚本时&#xff0c;需要确保已在JMeter中配置了Python解释器&#xff0c;并设置了正确的环境路径。 1、确保JMeter已安装Python解释器&#xff0c;并将解释器的路…

CSS3新特性(2-1)

CSS3新特性 前言border&#xff1a;radius标签属性选择器box-sizing透明度 前言 本文主要讲解CSS3有哪些新的特性和内容&#xff0c;那么好&#xff0c;本文正式开始. border&#xff1a;radius 新增了圆角边框概念&#xff0c;可以通过具体数值或者百分比&#xff0c;来让边…

Java特殊文件

Properties 读取数据 package com.itheima.d1;import java.io.FileNotFoundException; import java.io.FileReader; import java.nio.charset.StandardCharsets; import java.util.Properties; import java.util.Set;public class Test1 {public static void main(String[] arg…

mysql 变量和配置详解

MySQL 中还有一些特殊的全局变量&#xff0c;如 log_bin、tmpdir、version、datadir&#xff0c;在 MySQL 服务实例运行期间它们的值不能动态修改&#xff0c;也就是不能使用 SET 命令进行重新设置&#xff0c;这种变量称为静态变量。数据库管理员可以使用前面提到的修改源代码…

LV.12 D19 ADC实验 学习笔记

一、ADC简介 1.1 ADC ADC(Analog to Digital Converter)即模数转换器&#xff0c;指一个能将模拟信号转化为数字信号的电子元件 1.2 ADC主要参数 分辨率 ADC的分辨率一般以输出二进制数的位数来表示&#xff0c;当最大输入电压一定时&#xff0c;位数越高&#xff0c…

探索网络模型与协议:从OSI到HTTPs的原理解析

一、OSI网络模型 OSI&#xff08;Open Systems Interconnection&#xff09;七层网络参考模型和TCP/IP四层模型都是用于理解和设计计算机网络的框架&#xff0c;但它们之间存在一些差异。 1、七层 vs 四层 OSI七层网络参考模型&#xff1a; 物理层&#xff08;Physical Laye…

京东数据分析:2023年10月京东彩妆销售大数据采集

鲸参谋监测的京东平台10月份彩妆市场销售数据已出炉&#xff01; 鲸参谋数据显示&#xff0c;今年10月份&#xff0c;京东平台上彩妆市场的销量将近430万&#xff0c;环比增长约21%&#xff0c;同比下滑约3%&#xff1b;销售额将近5.8亿&#xff0c;环比增长约7%&#xff0c;同…