Python Qt GUI与数据可视化编程
上QQ阅读APP看书,第一时间看更新

3.2 QPushButton

QPushButton是常用的按钮组件,前面的一些示例中都是将其当作一个普通按钮使用的,为其clicked()信号编写槽函数进行响应。

QPushButton有一个checkable属性,如果设置为True, QPushButton按钮可以当作CheckBox或RadioButton使用。

图3-2是示例Demo3_2运行时界面。最上面一行的3个用于设置文字对齐方式的按钮只能选择一个,类似于QRadioButton组件。中间一行用于设置粗体、斜体、下划线的3个按钮可以切换选中状态,类似于QCheckBox组件。下面的3个QCheckBox组件用于控制下方的一个QLineEdit组件的属性。

图3-2 示例Demo3_2运行时界面

QPushButton按钮之所以具有这样的效果,是对按钮进行了分组,并且设置了相应的属性。一个容器组件内的同类型QPushButton按钮自动分成一组,图3-2中的6个QPushButton按钮的分组和关键属性设置如表3-2所示。

表3-2 窗体上QPushButton按钮的主要属性设置

窗体Widget.ui设计时的布局如图3-3所示,设置对齐方式的3个按钮用一个水平布局设置为一组,设置字体的3个按钮也采用水平布局设置为一组。窗体上所有组件的布局管理和属性设置可查看源文件Widget.ui。

图3-3 示例Demo3_2的窗体设计时界面

窗体业务逻辑类QmyWidget所在文件myWidget.py的代码如下(省略了窗体测试部分的代码):

        import sys
        from PyQt5.QtWidgets import  QApplication, QWidget
        from PyQt5.QtCore import  pyqtSlot, Qt
        from PyQt5.QtGui import  QFont
        from ui_Widget import Ui_Widget
        class QmyWidget(QWidget):
            def __init__(self, parent=None):
              super().__init__(parent)    #调用父类构造函数,创建窗体
              self.ui=Ui_Widget()         #创建UI对象
              self.ui.setupUi(self)       #构造UI


        ##  =======由connectSlotsByName() 自动关联的槽函数=================
            def on_btnAlign_Left_clicked(self):      ##"居左"按钮
              self.ui.editInput.setAlignment(Qt.AlignLeft)


            def on_btnAlign_Center_clicked(self):    ##"居中"按钮
              self.ui.editInput.setAlignment(Qt.AlignCenter)


            def on_btnAlign_Right_clicked(self):     ##"居右"按钮
              self.ui.editInput.setAlignment(Qt.AlignRight)


            @pyqtSlot(bool)    ##"粗体"按钮
            def on_btnFont_Bold_clicked(self, checked):
              font=self.ui.editInput.font()
              font.setBold(checked)
              self.ui.editInput.setFont(font)


            @pyqtSlot(bool)    ##"斜体"按钮
            def on_btnFont_Italic_clicked(self, checked):
              font=self.ui.editInput.font()
              font.setItalic(checked)
              self.ui.editInput.setFont(font)


            @pyqtSlot(bool)    ##"下划线"按钮
            def on_btnFont_UnderLine_clicked(self, checked):
              font=self.ui.editInput.font()
              font.setUnderline(checked)
              self.ui.editInput.setFont(font)


            @pyqtSlot(bool)    ##"Readonly"复选框
            def on_chkBox_Readonly_clicked(self, checked):
              self.ui.editInput.setReadOnly(checked)


            @pyqtSlot(bool)    ##"Enabled"复选框
            def on_chkBox_Enable_clicked(self, checked):
              self.ui.editInput.setEnabled(checked)


            @pyqtSlot(bool)    ##"ClearButtonEnabled"复选框
            def on_chkBox_ClearButton_clicked(self, checked):
              self.ui.editInput.setClearButtonEnabled(checked)

用于设置对齐方式的3个按钮是互斥的,点击一个按钮就可以设置相应的对齐方式,所以这3个按钮使用clicked()信号编写槽函数。

设置字体的3个按钮是可复选的,所以使用clicked(bool)信号编写槽函数,复选的状态参数checked可以在槽函数里直接使用。注意,QPushButton的信号clicked(bool)与clicked()是overload型信号,且clicked(bool)不是默认信号,所以需要使用修饰符@pyqtSlot(bool)进行函数参数类型说明。

QCheckBox组件一般使用clicked(bool)信号编写槽函数,复选状态可以作为参数传递给槽函数。

提示 如果窗体测试部分的程序没有特别的变化,后面在列出窗体业务逻辑类的代码时,都将省略窗体测试部分的代码。