上一集简单介绍了PyQt5的自定义信号与信号断开。那么,接下来,我们需要了解一下PyQt5有哪些控件可以供我们使用。

一般来说,涉及到UI编程,会用到的控件无非就是如下几种类型:标签、文本框、按钮、下拉框、对话框、计数器、滑动条、分隔线、图像绘制控件、多媒体播放控件、日历控件、日期时间控件等等。

本文主要是介绍几种常用的控件:标签、文本框、下拉框、按钮、对话框。

标签(QLabel)

这个控件主要是显示文字,在第二集的自定义信号中已经出现过,在此就不再重复讲解。

文本框

常见的控件之一,用户UI交互输入和展示的主要控件。文本框可以分为单行文本框与多行文本框,比如账号密码的输入框就是单行文本框,可以输入文章的文本框就是多行文本框。

单行文本框(QLineEdit)

在之前代码的init_ui函数中,添加如下代码即可查看效果:

self.label_1 = MyLabel(self, (10, 10, 100, 20), 'label_1', '我是标签:')
        self.line_edit = QLineEdit(self)
        self.line_edit.setObjectName('line_edit')
        self.line_edit.setGeometry(70, 10, 100, 20)
        self.line_edit.setText('我是单行文本框')
        # self.line_edit.setPlaceholderText('我是单行文本框')  # 自己看看是什么效果

Python pyqt的控件随着窗口大小改变_输入框

多行文本框(QTextEdit)

self.text_edit = QTextEdit(self)
        self.text_edit.setObjectName('text_edit')
        self.text_edit.setGeometry(10, 30, 100, 60)
        self.text_edit.setText('我是\n多行\n文本框')

Python pyqt的控件随着窗口大小改变_标签_02


看到这个多行文本框,我的第一反应是,咦?光标怎么在第一行的开头!这能忍?至于你能不能忍,反正我是不能。

cursor = self.text_edit.textCursor()
        pos = len(self.text_edit.toPlainText())
        cursor.setPosition(pos)
        self.text_edit.ensureCursorVisible()
        self.text_edit.setTextCursor(cursor)

Python pyqt的控件随着窗口大小改变_对话框_03

下拉框(QComboBox)

下拉框是展示数据常用的控件,不能输入,只能选择。

self.combox = QComboBox(self)
        self.combox.setObjectName('combox')
        self.combox.setGeometry(70, 10, 40, 20)
        datas = ['111', '222', '222', '333']
        self.combox.addItems(datas)

此时你是不是会思考,这个下拉框点击了之后呢?然后就没有然后了吗?肯定要把当前选择的数据进行处理吧?正是如此:

# 这一段就不用注释讲解了,如果看不懂,就再看看第一集的文章吧!
        def do_something():  # 仅作示范使用的函数
            idx = self.combox.currentIndex()
            QMessageBox.information(self, '哈哈哈', '你点了%s!' % datas[idx])
        # 这里activated可以换成currentTextChanged、currentIndexChanged试试效果
        self.combox.activated.connect(do_something)

Python pyqt的控件随着窗口大小改变_输入框_04

按钮

最常见的控件,没有之一!形式也有很多种,这里我就不一一介绍了,常用的几种类型如下:
QPushButton,这个就是最普通的按钮了,你想编写一个计算器的话,就需要创建很多个这样的按钮了。

QRadioButton,单选按钮,点击时切换状态,即checked和unchecked。此控件支持2种信号:toggled和clicked。toggle信号在切换单选钮状态时发射,clicked信号在每次点击时都会发射。

QCheckBox,复选按钮,提供多种选择的按钮,被选中或取消选中,都会发射一个stateChaged信号。
下面看看单选和复选按钮如何创建:

self.radio_btn = QRadioButton(self)
        self.radio_btn.setObjectName('radio_btn')
        self.radio_btn.setGeometry(120, 10, 100, 20)
        self.radio_btn.setText('我是单选按钮')

        self.check_btn = QCheckBox(self)
        self.check_btn.setObjectName('check_btn')
        self.check_btn.setGeometry(120, 30, 100, 20)
        self.check_btn.setText('我是复选按钮')

Python pyqt的控件随着窗口大小改变_标签_05


至于如何使用,大家结合第一集中的消息响应来自行尝试吧!总有需要自己动手的地方不是吗?

(其实是我实在是lan de写了,单选按钮一般都要有一个组合,然后还需要设置互斥,如果不设置互斥,那么除了长相更○之外,和复选按钮就没有什么区别了。。。)

对话框

其实在上面的例子里已经有用到对话框了,所以,我在这里也就不多做讲解了。直接贴一段对话框的代码吧!

# 提示对话框
    def message_box(self, text, title='Info'):
        if title.lower() in ['error', '错误']:
            QMessageBox.critical(self.centralwidget, title, text)
        elif title.lower() in ['warning', '警告']:
            QMessageBox.warning(self.centralwidget, title, text)
        else:
            QMessageBox.information(self.centralwidget, title, text)

    # 询问对话框
    def slotQuestion(self):  
        button=QMessageBox.question(self, "Question",
                                    self.tr("是否从头查找?"),
                                    QMessageBox.Ok|QMessageBox.Cancel,
                                    QMessageBox.Ok)
        if button==QMessageBox.Ok:
            self.label.setText("Question button/Ok")
        elif button==QMessageBox.Cancel:
            self.label.setText("Question button/Cancel")
        else:  
            return 

    # 带3个按钮的警告对话框
    def slotWarning(self):  
        button=QMessageBox.warning(self,"Warning",  
                                   self.tr("是否保存对文档的修改?"),  
                                   QMessageBox.Save|QMessageBox.Discard|QMessageBox.Cancel,  
                                   QMessageBox.Save)  
        if button==QMessageBox.Save:  
            self.label.setText("Warning button/Save")  
        elif button==QMessageBox.Discard:  
            self.label.setText("Warning button/Discard")  
        elif button==QMessageBox.Cancel:  
            self.label.setText("Warning button/Cancel")  
        else:  
            return

    # 关于对话框
    def slotAbout(self):  
        QMessageBox.about(self,"About",self.tr("About示例"))  
        self.label.setText("About MessageBox")

    # 关于QT的对话框  
    def slotAboutQt(self):  
        QMessageBox.aboutQt(self,"About Qt")  
        self.label.setText("About Qt MessageBox")