PyQt(三) 常见控件二
常见控件(二)
上节地址:https://www.cnblogs.com/Blogwj123/p/16167408.html
参考文章:https://www.cnblogs.com/caiya/p/15104266.html
参考文章:https://www.byhy.net/tut/py/gui/qt_02/
1.表格
QTableWidget
是表格控件;
表格控件单元格里面可以显示文字,也可以显示富文本、图片等内容。
表格控件的每个单元格里面要显示内容,都必须创建一个 QTableWidgetItem
类型的对象。
Qt Designer 如下图 选择:
1.1 创建标题栏
在界面设计师中进行创建,双击即显示设置框。
同理在行里面设计会显示新的行
1.2 操作行
insertRow
方法可以在指定位置插入一行,比如
table.insertRow(0) # 就插入一行到第 `1` 行这个位置, 表格原来第1行(包括原来的第1行)以后的内容,全部往下移动一行。
table.insertRow(2)
就插入一行到第 3
行这个位置, 表格原来第3行(包括原来的第3行)以后的内容,全部往下移动一行。
removeRow
方法可以删除指定位置的一行,比如
table.removeRow(0)
就删除第 1
行, 表格原来第1行以后的内容,全部往上移动一行。
table.removeRow(2)
就删除第 3
行, 表格原来第3行以后的内容,全部往上移动一行。
1.3 设置单元格
qt 表格的单元格内的内容对象是一个单元格对象 QTableWidgetItem
实例
如果单元格 没有被设置过
内容,可以这样
def click_button3(self): item=QTableWidgetItem() item.setText("啊哈哈哈") self.ui.table1.setItem(0,0,item) print("app run 3 ...")
简写
def click_button3(self): # item=QTableWidgetItem() # item.setText("啊哈哈哈") self.ui.table1.setItem(0,0,QTableWidgetItem("核弹女孩")) print("app run 3 ...")
补充:如果单用格中已经设置了文本,则会直接将原来的内容进行覆盖。
如果单元格 已经被设置过
文本内容,item
方法可以获取指定位置的 QTableWidgetItem ,再调用这个对象的 setText
方法,就可以设置单元格文本内容,比如
table.item(0,0).setText('白月黑羽-江老师')
就设置了 第1行,第1列
的单元格里面的文本。
table.item(2,4).setText('白月黑羽-江老师')
就设置了 第3行,第5列
的单元格里面的文本。
说明:表格在程序中定位使用的索引是从 0 开始的。
1.4 设置只读
如果希望某个单元格为 只读,不允许修改,可以使用QTableWidgetItem对象的 setFlags
方法,
def click_button3(self): item=QTableWidgetItem("啊哈哈哈") item.setFlags(Qt.ItemIsEnabled) self.ui.table1.setItem(0,0,item) print("app run 3 ...")
1.5 居中对齐
def click_button3(self): item=QTableWidgetItem("啊哈哈哈") item.setTextAlignment(Qt.AlignCenter) self.ui.table1.setItem(0,0,item) print("app run 3 ...")
1.6 获取信息
1.6.1 获取单元格内容
def click_button4(self): # self.ui.table1.item(0, 0).setText("胖子与小男孩") res=self.ui.table1.item(0,0).text() print(res)
1.6.2 获取所有行数列数
def click_button4(self): # self.ui.table1.item(0, 0).setText("胖子与小男孩") # res=self.ui.table1.item(0,0).text() res1=self.ui.table1.rowCount() res2=self.ui.table1.columnCount() print(res1,res2)
1.6.3 获取当前选中行
def click_button4(self): currentrow = self.ui.table1.currentRow() print(currentrow)
1.7 设置行数和列数
def click_button4(self): # 自动生成行数和列数以数字填充 self.ui.table1.setRowCount(6) self.ui.table1.setColumnCount(3)
1.8 清除所有内容
def click_button4(self): self.ui.table1.clearContents() # 会清除掉表格内所有的内容吗,但是表格会留下;
def click_button4(self): # self.ui.table1.clearContents() # 法一 self.ui.table1.setRowCount(0)# 法二 # 直接将除表头外的所有内容消除
信号:单元格内容改动
当用户修改了一个单元格的内容,会发出 cellChanged
信号,并且携带参数指明该单元格的行号和列号。
我们的代码可以对该信号进行相应的处理。
# -*- coding: utf-8 -*- ''' @Time : 2022/4/21 8:44 @Author : ziqingbaojian @File : demo_table.py ''' import sys from PyQt5.QtWidgets import QWidget,QMainWindow,QApplication,QTableWidgetItem from PyQt5.QtCore import Qt from PyQt5.uic import loadUi class QtWin(QMainWindow): def __init__(self): super(QtWin, self).__init__() self.ui.table1.cellChanged.connect(self.item_change) def item_change(self): # 获取更改内容 cfgName = self.ui.table1.item(0, 0).text() # 首列为配置名称 cfgValue = self.ui.table1.item(0, 0).text()# print(cfgName,cfgValue) if __name__ == '__main__': app=QApplication(sys.argv) obj=QtWin() obj.ui.show() sys.exit(app.exec_())
1.10 设定列宽、宽度自动缩放
Qt Designer 上目前没法拖拽设定 每个列的宽度,只能在代码中指定。
如下所示
# 设定第1列的宽度为 180像素 table.setColumnWidth(0, 180) # 设定第2列的宽度为 100像素 table.setColumnWidth(1, 100)
如想让 表格控件宽度 随着父窗口的缩放自动缩放,可以
在 属性编辑器 中 勾选 HorizontalHeaderStretchLastSection
或者使用下面代码
table.horizontalHeader().setStretchLastSection(True)
1.11 边界线样式
表格控件的边界线颜色可以通过QSS 属性 gridline-color
指定
如下所示
QTableWidget { gridline-color: green; }
就会指定表格边界线颜色为 绿色。
1.12 全部代码
# -*- coding: utf-8 -*- ''' @Time : 2022/4/21 8:44 @Author : ziqingbaojian @File : demo_table.py ''' import sys from PyQt5.QtWidgets import QWidget,QMainWindow,QApplication,QTableWidgetItem from PyQt5.QtCore import Qt from PyQt5.uic import loadUi class QtWin(QMainWindow): def __init__(self): super(QtWin, self).__init__() self.ui=loadUi("../ui/table.ui") self.ui.button1.clicked.connect(self.click_button1) self.ui.button2.clicked.connect(self.click_button2) self.ui.button3.clicked.connect(self.click_button3) self.ui.button4.clicked.connect(self.click_button4) self.ui.table1.cellChanged.connect(self.item_change) # self.ui.table1.insertRow(0) # 设置点击按钮的时候进行数据的插入 def click_button1(self): self.ui.table1.insertRow(0)# 插入一行 print("hello world") def click_button2(self): self.ui.table1.removeRow(0) #删除指定位置的一行,参数为函数 print("app run ..") def click_button3(self): item=QTableWidgetItem("核弹女孩") item.setTextAlignment(Qt.AlignCenter) self.ui.table1.setItem(0,0,item) print("app run 3 ...") def click_button4(self): # self.ui.table1.clearContents() # 法一 self.ui.table1.setRowCount(0)# 法二 # self.ui.table1.setRowCount(6) # self.ui.table1.setColumnCount(3) # currentrow = self.ui.table1.currentRow() # print(currentrow) # self.ui.table1.item(0, 0).setText("胖子与小男孩") # res=self.ui.table1.item(0,0).text() # res1=self.ui.table1.rowCount() # res2=self.ui.table1.columnCount() # print(res1,res2) # print("app run 4 ...") def item_change(self): # 获取更改内容 cfgName = self.ui.table1.item(0, 0).text() # 首列为配置名称 cfgValue = self.ui.table1.item(0, 0).text()# print(cfgName,cfgValue) if __name__ == '__main__': app=QApplication(sys.argv) obj=QtWin() obj.ui.show() sys.exit(app.exec_())
补充:打开文件
QFileDialog 是一个打开文件或者文件夹选择对话框。类似于我们平时上传文件选择文件的界面
打开文件有以下3种:
1、单个文件打开 QFileDialog.getOpenFileName()
2、多个文件打开 QFileDialog.getOpenFileNames()
3、打开文件夹 QFileDialog.getExistingDirectory()
import sys from PyQt5.QtWidgets import QWidget,QMainWindow,QApplication,QTableWidgetItem,QFileDialog from PyQt5 import Qt from PyQt5.uic import loadUi class QtWin(QMainWindow): def __init__(self): super(QtWin, self).__init__() self.ui.buttonfile.clicked.connect(self.get_file) self.ui.table1.cellChanged.connect(self.item_change) # self.ui.table1.insertRow(0) def get_file(self): QFileDialog.getOpenFileName(self,'选择文件','','Excel files(*.xlsx , *.xls)')
2. 单选按钮 和 按钮组
QRadioButton
是单选按钮,如下图所示
同一个父窗口
里面的多个单选按钮,只能选中一项。
如果你有多组单选按钮, 每组都应该有不同的父控件,或者不同的Layout。
通常建议:多组单选按钮,放到不同的 按钮组 QButtonGroup
中
2.1 信号:选中状态改变
如果用户操作点击了按钮组 QButtonGroup
中的一个按钮, QButtonGroup 就会发出 buttonClicked
信号,可以这样指定处理该信号的函数
buttongroup.buttonClicked.connect(handleButtonClicked)
然后,在处理函数中调用QButtonGroup对象的 checkedButton()
函数,返回值就是被选中的按钮对象。
再调用这个返回的按钮对象的 text()
方法得到界面文本,就可以知道是哪个选项被选中了。
3. 勾选按钮 和 按钮组
QCheckBox
是勾选按钮,如下图所示
通常建议:多组勾选按钮,放到不同的 按钮组 QButtonGroup
中,按钮组就是父控件。
可以在 Qt设计师中设置 QButtonGroup 的 exclusive
属性, 来控制 是否 只能单选一个选项。
3.3 信号:选中状态改变
如果用户操作点击了按钮组 QButtonGroup
中的一个按钮, QButtonGroup 就会发出 buttonClicked
信号,可以这样指定处理该信号的函数
buttongroup.buttonClicked.connect(handleButtonClicked)
QButtonGroup 设置为 单选
情况下:
在处理函数中调用QButtonGroup对象的 checkedButton()
函数,返回值就是被选中的按钮对象。
再调用这个返回的按钮对象的 text()
方法得到界面文本,就可以知道是哪个选项被选中了。
QButtonGroup 设置为 多选
情况下:
要得知哪些按钮被选中, 可以 对所有该组中的 按钮调用 isChecked
方法 ,来判断。
4.提示框
QMessageBox
类可以用来弹出各种提示框
该类可以通过一系列静态方法,显示 如下弹出框
- 错误报告
使用 critical
方法
QMessageBox.critical( self.ui, '错误', '请选择爬取数据存储路径!')
- 警告
使用 warning
方法
QMessageBox.warning( self.ui, '阅读太快', '阅读客户协议必须超过1分钟')
- 信息提示
使用 information
方法
QMessageBox.information( self.ui, '操作成功', '请继续下一步操作')
也可以使用 about
方法
QMessageBox.about( self.ui, '操作成功', '请继续下一步操作')
- 确认继续
使用 question
方法
choice = QMessageBox.question( self.ui, '确认', '确定要删除本文件吗?') if choice == QMessageBox.Yes: print('你选择了yes') if choice == QMessageBox.No: print('你选择了no')
- 输入对话框
QInputDialog
输入对话框 只让用户输入一行数据信息,比如 姓名、年龄等。
可以方便的用来获取简单的信息。
5. 菜单
可以在 Qt Designer上很方便的添加菜单,如下所示
点击菜单的信号是 triggered
, 处理点击菜单的的代码如下
self.ui.actionOpenFile.triggered.connect(self.openPageFile)
注意:如果菜单和工具栏有 相同的 action
,通常是先在 动作编辑器 创建一个action, 然后分别拖动到 菜单 和 工具栏
5.1 工具栏
在 Qt 设计师上添加工具栏,可以右键点击 Main Window
类型的窗体空白处,如下所示
选择添加工具栏
注意,只有 Main Window
类型的窗体,才能添加工具栏,如下
添加工具栏后,还要在工具栏上添加图标。
方法是点击右下角 动作编辑器,新建动作,如下图所示
然后如下图所示进行设置
添加动作成功后,就可以直接拖到工具栏上了。
然后,在代码中定义动作触发后的处理函数,如下所示
self.ui.actionAddNote.triggered.connect(self.actionAddNode)
5.2 状态栏
要在状态栏显示文本信息,只需要调用 QStatusBar 的 showMessage
方法
self.ui.statusbar.showMessage(f'打开文件{filePath}')
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· 单线程的Redis速度为什么快?
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码