《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】

运行结果如下:

o9qdOO.png

创建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()

运行结果如下:

o9qskd.md.png

【完整代码参考附件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()

运行结果如下:

o9q21P.png

【完整代码参考附件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】

运行结果如下:

o9q57Q.png


资源获取方法

1.扫描下面二维码,关注公众号[AI实验楼]
2.在公众号回复关键词[PyQt5]获取资料提取码

AI实验楼


欢迎访问我的网站

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

Related posts

Leave a Comment