《PyQT5软件开发 - 控件篇》第1章 按钮-1(QPushButton)

按钮是所有GUI程序中最得很多的一种控件,而按钮的种类有很多,这里要讲的是QPushButton。QPushButton是使用频率最高一种控件,它用来给用户点击,来完成某种动作的控件。

QPushButton继承于基类QAbstractButton;QAbstractButton的方法QPushButton都可以用。

QPushButton有三种常用的场景:

1.普通按钮
2.菜单功能
3.右键菜单

另外,QPushButton还可设置扁平化。

下面一一讲解。

1.1 QPushButton 创建及使用

QPushButton的构造函数有很多,常用的有以下几个:

QPushButton() 创建一个无父控件的按钮控件
QPushButton(parent) 创建控件的同时, 设置父控件
QPushButton(text, parent) 创建控件的同时, 设置提示文本和父控件
QPushButton(icon, text, parent) 创建控件的同时, 设置图标, 提示文本和父控件

QPushButton是讲控件的第一个例子,这里会讲解如何使用代码来创建控件,后面直接在Designer 拖控件,然后生成Python代码。

核心代码如下:

## MainWindow
class MainWindow(QtWidgets.QMainWindow):
    
    #init
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)

        self.setWindowTitle("QPushButton")
        self.resize(500, 500)
        
        ## 方法一
        # btn = QtWidgets.QPushButton(self)
        # btn.setParent(self)  # 设置父类
        # btn.setText("open")  # 添加文本
        # btn.setIcon(QIcon("./images/open.ico"))  # 添加图片
        
        ## 方法二
        btn = QtWidgets.QPushButton(QIcon('./images/open.ico'),'open', self) 
        
        self.show()   

【完整代码参考附件1.Create QPushButton】

运行结果如下:

创建QPushButton用了两种方式,第一种是先创建QPushButton控件,然后来设置QPushButton参数,第二种是创建QPushButton的同时设置QPushButton参数。

QPushButton继承QAbstractButton,因此QPushButton的常用方法如下:

方法 描述
setCheckable() 设置按钮是否已经被选中,如果设置True,则表示按钮将保持已点击和释放状态
toggle() 在按钮状态之间进行切换
setIcon() 设置按钮上的图标
setEnabled() 设置按钮是否可以使用,当设置为False时,按钮变成不可用状态,点击它不会发射信号
isChecked() 返回按钮的状态,返回值为True或者False
setDefault() 设置按钮的默认状态
setText() 设置按钮的显示文本
text() 返回按钮的显示文本

核心代码如下:

from PyQt5 import QtWidgets
from PyQt5.QtGui import QGuiApplication, QIcon
from PyQt5.QtCore import QTimer

import time

from ui.ui_mainpage import Ui_MainWindow

## MainWindow
class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
    
    #init
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setWindowTitle('QPushButton')
        
        self.setupUi(self)
        
        self.show()   
    
        self.runTime = 5
    
        self.count = self.runTime
        #######################################################################
        ## 绑定事件
        self.pushButton.clicked.connect(self.btn_clicked)

        self.time = QTimer(self)
        self.time.setInterval(1000)
        self.time.timeout.connect(self.run_refresh)

    def btn_clicked(self):
        """
        Brief
        ----------
            pushButton clicked
        
        Parameters
        ----------
            None

        Returns
        ----------
            None
        """
        if self.pushButton.isEnabled():
            self.time.start()
            self.pushButton.setEnabled(False)
        
    def run_refresh(self):
        """
        Brief
        ----------
            pushButton clicked
        
        Parameters
        ----------
            None

        Returns
        ----------
            None
        """
        if self.count > 0:
            self.label.setText(str(self.count)+'秒后运行完成')
            self.count -= 1
        else:
            self.time.stop()
            self.label.setEnabled(True)
            self.pushButton.setEnabled(True)
            self.label.setText('准备运行')
            self.count = self.runTime

    def closeEvent(self, event):
        """
        Brief
        ----------
            Close Event
        
        Parameters
        ----------
            event

        Returns
        ----------
            None
        """
        event.accept()

运行结果如下:

【完整代码参考附件2.QPushButton】

代码很简单,首先使用QTimer作为一个定时器,用于模拟运行一个任务需要的时间。
首先新建了QTimer对象,并定义了超时时间和超时后对应的槽函数。

self.time = QTimer(self)
self.time.setInterval(1000)
self.time.timeout.connect(self.run_refresh)

定时器的槽函数如下:

def run_refresh(self):
    """
    Brief
    ----------
        pushButton clicked
    
    Parameters
    ----------
        None

    Returns
    ----------
        None
    """
    if self.count > 0:
        self.label.setText(str(self.count)+'秒后运行完成')
        self.count -= 1
    else:
        self.time.stop()
        self.label.setEnabled(True)
        self.pushButton.setEnabled(True)
        self.label.setText('准备运行')
        self.count = self.runTime

为按钮添加事件。

self.pushButton.clicked.connect(self.btn_clicked)

def btn_clicked(self):
    """
    Brief
    ----------
        pushButton clicked
    
    Parameters
    ----------
        None

    Returns
    ----------
        None
    """
    if self.pushButton.isEnabled():
        self.time.start()
        self.pushButton.setEnabled(False)

单击按钮后,对按钮进行判断,若按钮没有被禁用,则激活定时器,同时将按钮禁用,即禁止点击。
进入超时状态后,我们开始倒计时。同时让label上的文字不断变化。
当倒计时完成的时候,我们停止定时器。将按钮恢复成正常的状态。同时重置倒计时的值,为下次的使用做好准备。

1.2 QPushButton菜单功能

所谓菜单,就是在点击它们以后会弹出相关的一个菜单,提供更多的功能供用户选择。
下面笔者就通过一个实例讲解。

核心代码如下:

from PyQt5 import QtWidgets
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QMenu, QAction

## MainWindow
class MainWindow(QtWidgets.QWidget):
    
    #init
    def __init__(self):
        super().__init__()

        self.setWindowTitle('QPushButton')
        self.resize(500, 200)
        
        ibtn = QtWidgets.QPushButton(self)
        ibtn.setText('菜单按钮')
        ibtn.setIcon(QIcon('./images/menu.ico'))
        
        mbtn = QtWidgets.QPushButton('菜单', self)
        mbtn.move(100, 0)
        
        menu = QMenu(self)
        
        submenu = QMenu(menu)
        submenu_test = QAction(QIcon('./images/file.ico'), '新建', submenu)
        submenu.addAction('File')
        submenu_test.setMenu(submenu)
        menu.addAction(submenu_test)
        
        menu.addSeparator()# 添加分割线
        
        open_action = QAction("打开", menu)
        open_action.setIcon(QIcon('./images/open.ico'))
        open_action.triggered.connect(lambda: print("打开文件"))
        menu.addAction(open_action)
        
        menu.addSeparator()# 添加分割线
        
        menu.addAction(QIcon('./images/exit.ico'), '退出程序')
        
        mbtn.setMenu(menu)

        self.show()   
    
    def closeEvent(self, event):
        """
        Brief
        ----------
            Close Event
        
        Parameters
        ----------
            event

        Returns
        ----------
            None
        """
        event.accept()

运行结果如下:

【完整代码参考附件3.QPushButton_Menu】

代码中使用addAction来添加一个动作(Action),也可以通过 addActions 来添加多个动作。在按钮中添加一个菜单只需要通过setMenu()函数即可,参数为Menu对象。而Menu则可以添加QAction,子菜单,分割线等等,还是比较简单的。

1.3 QPushButton扁平化

当设置了扁平化,也就是不绘制按钮的背景颜色和边框,看起来就像和父控件在一个平面上,通过setFlat()来设置。通过isFlat()获取当前按钮边框是否扁平。

核心代码如下:

from PyQt5 import QtWidgets
from PyQt5.QtGui import QIcon

## MainWindow
class MainWindow(QtWidgets.QWidget):
    
    #init
    def __init__(self):
        super().__init__()

        self.setWindowTitle('QPushButton')
        self.resize(500, 200)
        
        ibtn = QtWidgets.QPushButton(self)
        ibtn.setText('菜单按钮')
        ibtn.setIcon(QIcon('./images/menu.ico'))
        ibtn.setFlat(True)
        
        self.show()   
    
    def closeEvent(self, event):
        """
        Brief
        ----------
            Close Event
        
        Parameters
        ----------
            event

        Returns
        ----------
            None
        """
        event.accept()

【完整代码参考附件4.QPushButton_setFlat】

运行结果如下:




资源获取方法

1.关注公众号[AI实验楼]
2.在公众号回复关键词[PyQt5]获取资料提取码


欢迎访问我的网站

BruceOu的哔哩哔哩
BruceOu的主页
BruceOu的博客
BruceOu的CSDN博客
BruceOu的简书
BruceOu的知乎

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容