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

news2024/10/6 20:36:54

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_())

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

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

相关文章

基于Vue+SpringBoot的个人健康管理系统

项目编号&#xff1a; S 040 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S040&#xff0c;文末获取源码。} 项目编号&#xff1a;S040&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 健康档案模块2.2 体检档案模块2.3 健…

Linux 6.7全面改进x86 CPU微码加载方式

导读最近&#xff0c;社区在清理 Linux 上的 Intel/AMD x86 CPU 微代码加载方面做了大量的工作&#xff0c;这些工作现已合并到 Linux 6.7 中。 由于在启动时加载 CPU 微代码对于减少不断出现的新 CPU 安全漏洞以及有时解决功能问题非常重要&#xff0c;Thomas Gleixner 最近开…

什么是 TLS/SSL 握手

TLS/SSL 握手是一个加密过程&#xff0c;每当客户端&#xff08;如浏览器&#xff09;与服务器建立连接时&#xff0c;都会在后台进行&#xff0c;此握手协议有助于客户端和服务器之间的安全连接&#xff0c;从而促进隐私、数据完整性和机密性。 TLS/SSL 握手何时发生 每当客…

【开源】基于Vue.js的数据可视化的智慧河南大屏

项目编号&#xff1a; S 059 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S059&#xff0c;文末获取源码。} 项目编号&#xff1a;S059&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示四、核心代码4.1 数据模块 …

前端技术探秘-Nodejs的CommonJS规范实现原理 | 京东物流技术团队

了解Node.js Node.js是一个基于ChromeV8引擎的JavaScript运行环境&#xff0c;使用了一个事件驱动、非阻塞式I/O模型&#xff0c;让JavaScript 运行在服务端的开发平台&#xff0c;它让JavaScript成为与PHP、Python、Perl、Ruby等服务端语言平起平坐的脚本语言。Node中增添了很…

idea 问题合集

调试按钮失效&#xff1a; 依次点击&#xff1a;Modules-web-src-Sources&#xff0c;重启IDEA即可&#xff08;网上看到的方法&#xff0c;原因呢未明&#xff09;

了解冶金行业MES系统的重要性与优势

冶金行业生产工艺极为复杂&#xff0c;冶金行业生产的产品种类多而繁复&#xff0c;并且每种企业生产的产品差异性极大&#xff0c;加上该行业生产需要各种大型生产设备&#xff0c;导致其工艺流程繁琐复杂&#xff0c;也因此在其生产过程中存在许多不安全的因素&#xff0c;若…

ros2 mqtt-client 安装并测试

mqtt_client包提供了 ROS Nodelet 或 ROS 2组件节点&#xff0c;使连接的基于 ROS 的设备或机器人能够使用MQTT协议通过 MQTT 代理交换 ROS 消息。这通常适用于任意 ROS 消息类型。mqtt_client还可以与在不基于 ROS 的设备上运行的 MQTT 客户端交换原始消息。 源码地址&#xf…

系列五、声明式事务(xml方式)

一、概述 声明式事务(declarative transaction management)是Spring提供的对程序事务管理的一种方式&#xff0c;Spring的声明式事务顾名思义就是采用声明的方式来处理事务。这里所说的声明&#xff0c;是指在配置文件中声明&#xff0c;用在Spring配置文件中声明式的处理事务来…

什么是高防CDN?CDN的设计原理及应用场景是什么?

随着互联网的快速发展&#xff0c;人们对网络的速度和稳定性要求也越来越高。CDN技术作为网络优化的重要手段&#xff0c;被越来越多的企业和网站所采用。现在我为大家介绍一下CDN的设计原理以及应用场景。 一.高防CDN技术概述 高防CDN是一种应用了高级防御技术的内容分发网络…

uni-app,nvue中text标签文本超出宽度不换行问题解决

复现&#xff1a;思路&#xff1a; 将text标签换为rich-text&#xff0c;并给rich-text增加换行的样式class类名解决&#xff1a;

C语言--不创建第三个变量,实现对两个数字的交换

我们先来看一下&#xff0c;创建第三个变量交换两个数字。 #include<stdio.h> {int a2;int b3;int tmp0;tmpa;ab;btmp;return 0; } 再看一下不创建的方法 法一&#xff1a; //加减法 缺点可能会溢出 int main() {int a3;int b5;printf("before:a%d b%d\n"…

PSNR计算

1.比较不同图像预处理方式对PSNR的影响 下面的代码是将单张图片喂入JSCC&#xff0c;计算PSNR。实验目的是&#xff1a;比较不同图像预处理方式对PSNR的影响。 PSNR定义如下 from torch.nn import MSELoss from PIL import Image img_PIL Image.open("/home/xxx/xxx/da…

HandBrake 1.7 近日发布

导读HandBrake 1.7 近日发布&#xff0c;作为这个开源、免费和跨平台视频转码器应用程序的重大更新&#xff0c;适用于 GNU/Linux、macOS 和 Windows 系统。 在 HandBrake 1.6 发布近一年后&#xff0c;HandBrake 1.7 版本为 Linux 用户提供了许多好处&#xff0c;包括视频摘要…

优思学院|质量工程师在汽车行业待遇好吗?

优思学院认为质量工程师在汽车行业的待遇有可能相对较好的。随着中国汽车品牌在国内市场的崛起&#xff0c;特别是在电动汽车领域的增长&#xff0c;质量工程师在保障产品质量和安全性方面变得非常重要。由于中国汽车制造商对产品质量的高度重视&#xff0c;质量工程师在制定和…

微信小程序埋点

使用如下代码封装一下&#xff0c;例如封装在log.js文件里面&#xff1a; var log wx.getRealtimeLogManager ? wx.getRealtimeLogManager() : nullmodule.exports {debug() {if (!log) returnlog.debug.apply(log, arguments)},info() {if (!log) returnlog.info.apply(l…

AC自动机(简单模板)

AC自动机&#xff0c;就相当于是在字典树上用kmp。next数组回退的位置为最大匹配字符串在字典树上的节点位置。 在获取字典树上的next数组的时候用的是BFS每次相当与处理的一层。 下图中红线为&#xff0c;可以回退的位置&#xff0c;没有红线的节点回退的位置都是虚拟原点。…

部署系列六基于nndeploy的深度学习 图像降噪unet部署

文章目录 1.直接在源代码demo中修改2. 如何修改呢&#xff1f; https://github.com/DeployAI/nndeploy https://nndeploy-zh.readthedocs.io/zh/latest/introduction/index.html 1.直接在源代码demo中修改 如果你想运行yolo5: onnxruntime:115ms ./install/lib/demo_nndeploy_…

阿里云OSS代码集成部分问题分析

公司内部开发了一个文件相关的应用&#xff0c;由于服务器带宽限制导致多个用户同时上传或者下载文件时速度很慢&#xff0c;遂将文件迁移至阿里云OSS服务器。下面是迁移的过程中遇到的部分问题。 问题1. 跨域错误 错误信息如下&#xff1a; Access to XMLHttpRequest at htt…

js检测dom变化的方法:MutationObserver

前言 检测一个原生dom的变化,如一个div的颜色,大小,所在位置,内部元素的属性是否变化,更深层dom树上的变化等等。 都可以使用一个window上暴露出来的一个api:MutationObserver 语法 官方地址:MutationObserver.MutationObserver() - Web API 接口参考 | MDN 使用new Mutat…