上一集简单介绍了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('我是单行文本框') # 自己看看是什么效果
多行文本框(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文本框')
看到这个多行文本框,我的第一反应是,咦?光标怎么在第一行的开头!这能忍?至于你能不能忍,反正我是不能。于是,在网上借鉴了一位兄台的代码(代码来源地):
cursor = self.text_edit.textCursor()
pos = len(self.text_edit.toPlainText())
cursor.setPosition(pos)
self.text_edit.ensureCursorVisible()
self.text_edit.setTextCursor(cursor)
下拉框(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)
按钮
最常见的控件,没有之一!形式也有很多种,这里我就不一一介绍了,常用的几种类型如下:
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('我是复选按钮')
至于如何使用,大家结合第一集中的消息响应来自行尝试吧!总有需要自己动手的地方不是吗?
(其实是我实在是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")
总结
今天的文章写得有点长,有点啰唆,希望大家能看明白!
下一集,我们将讲解一下PyQt5如何创建自定义控件!这个网上的教程比较少,敬请期待!