美文网首页
《PyQT5软件开发 - 控件篇》第1章 按钮-1(QPushB

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

作者: BruceOu | 来源:发表于2021-11-24 23:23 被阅读0次

    按钮是所有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的知乎

    相关文章

      网友评论

          本文标题:《PyQT5软件开发 - 控件篇》第1章 按钮-1(QPushB

          本文链接:https://www.haomeiwen.com/subject/dmdgtrtx.html