组合选择框

QComboBox 是组合选择框,如下图所示

image

官网介绍

信号:选项改变

如果用户操作修改了QComboBox中的选项就会发出 currentIndexChanged 信号,可以这样指定处理该信号的函数

1
cbox.currentIndexChanged.connect(handleSelectionChange)

添加一个选项

代码中可以使用 addItem 方法来添加一个选项到 末尾 ,参数就是选项文本

1
cbox.addItem('byhy')

添加多个选项

代码中可以使用 addItems 方法来添加多个选项到 末尾,参数是包含了多个选项文本的列表

1
cbox.addItems(['byhy','白月黑羽','python教程'])

清空选项

代码中可以使用 clear 方法来清空选项,也就是删除选择框内所有的选项

1
cbox.clear()

获取当前选项文本

代码中可以使用 currentText 方法来获取当前 选中的选项 的文本,比如

1
method = cbox.currentText()

列表

QListWidget 是列表控件,如下图所示

image

Qt Designer 如下图 选择:

image

列表里面每个列表项对应的类型是 QListWidgetItem

QListWidget 官网介绍

QListWidgetItem 官网介绍

实例化

可以通过Qt设计师创建UI,然后加载界面的方式实例化。

也可以直接通过代码创建列表控件实例

1
2
3
4
from PySide2 import  QtWidgets

# parent变量对应的是父控件对象
listWidget = QtWidgets.QListWidget(parent)

添加一个列表项

代码中可以使用 addItem 方法来添加一个列表项到 末尾 ,参数就是列表项文本

1
listWidget.addItem('byhy')

如果你要添加的列表项并非简单的文本,而是,比如有图标

则需要添加参数是一个 QListWidgetItem 实例

1
2
3
4
5
6
7
8
9
10
11
# 创建QListWidgetItem实例
listItem = QListWidgetItem()

# 设置图标
listItem.setIcon(some_icon)

# 可以给该列表项关联任意的对象
listItem.deviceCtrl = deviceCtrl

# 添加到列表控件中
listWidget.addItem(listItem)

添加多个列表项

代码中可以使用 addItems 方法来添加多个列表项到 末尾,参数是包含了多个列表项文本的列表

1
listWidget.addItems(['byhy','白月黑羽','python教程'])

删除一个列表项

代码中可以使用 takeItem 方法来删除1个列表项,参数是该列表项所在行

1
listWidget.takeItem(1)

就会删除第二行列表项

那,怎么指定某个item是第几行呢?

使用row方法,如下

1
listWidget.row(item)

清空列表项

代码中可以使用 clear 方法来清空列表项,也就是删除选择框内所有的列表项

1
listWidget.clear()

设置某个列表项为当前列表项

可以通过 setCurrentItem 方法,设置某个列表项为当前列表项

如下

1
listWidget.setCurrentItem(listItem)

获取当前列表项文本

currentItem 方法可以得到列表当前选中项对象(QListWidgetItem) ,再调用这个对象的 text 方法,就可以获取文本内容,比如

1
listWidget.currentItem().text()

可以使用 item 方法获取指定某行的 QListWidgetItem,

比如,

1
listWidget.item(0).text()

就获取了 第1行 的列表项的文本。

遍历列表项

可以这样遍历列表里面的每个item

1
2
3
for i in range(listWidget.count()):
# 取出列表项
listItem = listWidget.item(i)

信号:选项选择改变

如果用户鼠标或者键盘选择了一个选项,Qt就会发出 itemSelectionChanged 信号,可以这样指定处理该信号的函数

1
2
3
self.listWidget.itemSelectionChanged.connect(
self.handleSelectionChange
)

然后定义一个处理函数

1
2
3
4
# 设备列表项选择改变 信号处理
def handleSelectionChange(self):
# 当前选择项目
currentItem = self.listWidget.currentItem()

信号:选项文本改变

如果列表项文本可以编辑,并且用户修改了文本,Qt就会发出 itemChanged 信号,可以这样指定处理该信号的函数

1
2
3
self.listWidget.itemChanged.connect(
self.handleItemTextChange
)

然后定义一个处理函数

1
2
3
4
5
# 设备列表项选择改变 信号处理
# 参数 item 是修改的 QListWidgetItem对象
def handleItemTextChange(self, item):
# 这里写处理代码

表格

QTableWidget 是表格控件,如下图所示

image

表格控件单元格里面可以显示文字,也可以显示富文本、图片等内容。

表格控件的每个单元格里面要显示内容,都必须创建一个 QTableWidgetItem 类型的对象。

Qt Designer 如下图 选择:

image

官网介绍: QTableWidge

官网介绍: QTableWidgetItem

实例化

可以通过Qt设计师创建UI,然后加载界面的方式实例化。

也可以直接通过代码创建表格控件实例

1
2
3
4
5
6
7
from PySide2 import  QtWidgets

rows = 0 # 行数
columns = 2 # 列数

# parent变量对应的是父控件对象
table = QtWidgets.QTableWidget(rows, columns, parent)

创建列 和 标题栏

我们可以通过 Qt designer 为一个表格创建列和对应的标题栏。

只需要双击 Qt designer 设计的窗体中的 表格控件, 就会出现这样的对话框。

image

在 列 标签栏中,点击左下角的加号,就可以为 添加一个列,并且设置标题栏名称。

image

插入一行、删除一行

insertRow 方法可以在指定位置插入一行,比如

1
table.insertRow(0)

就插入一行到第 1 行这个位置, 表格原来第1行(包括原来的第1行)以后的内容,全部往下移动一行。

1
table.insertRow(2)

就插入一行到第 3 行这个位置, 表格原来第3行(包括原来的第3行)以后的内容,全部往下移动一行。

removeRow 方法可以删除指定位置的一行,比如

1
table.removeRow(0)

就删除第 1 行, 表格原来第1行以后的内容,全部往上移动一行。

1
table.removeRow(2)

就删除第 3 行, 表格原来第3行以后的内容,全部往上移动一行。

插入图片

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from PySide2.QtGui import QPixmap
from PySide2.QtWidgets import QTableWidget, QTableWidgetItem

# 创建 QTableWidget
table = QTableWidget()

# 设置行列数
table.setRowCount(1)
table.setColumnCount(1)

# 创建 QTableWidgetItem 并将其添加到单元格中
item = QTableWidgetItem()
pixmap = QPixmap('path/to/image.jpg')
item.setData(Qt.DecorationRole,pixmap)
table.setItem(0, 0, item)

插入图标

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from PySide2.QtGui import QPixmap
from PySide2.QtWidgets import QTableWidget, QTableWidgetItem

# 创建 QTableWidget
table = QTableWidget()

# 设置行列数
table.setRowCount(1)
table.setColumnCount(1)

# 创建 QTableWidgetItem 并将其添加到单元格中
item = QTableWidgetItem()
pixmap = QPixmap('path/to/image.jpg')
item.setIcon(QIcon(pixmap))
table.setItem(0, 0, item)

更改行列间隔

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
from PySide2.QtGui import QPixmap
from PySide2.QtWidgets import QTableWidget, QTableWidgetItem

# 创建 QTableWidget
table = QTableWidget()

# 设置行列数
table.setRowCount(2)
table.setColumnCount(2)

# 创建 QTableWidgetItem 并将其添加到单元格中
item1 = QTableWidgetItem()
pixmap1 = QPixmap('path/to/large/image.jpg') # 使用较大的图片
item1.setIcon(QIcon(pixmap1))
table.setItem(0, 0, item1)


item2 = QTableWidgetItem()
pixmap2 = QPixmap('path/to/small/image.jpg') # 使用较小的图片
item2.setIcon(QIcon(pixmap2))
table.setItem(1, 1, item2)

# 自适应单元格大小和列宽
table.resizeColumnToContents(0)
table.resizeColumnToContents(1)
table.resizeRowToContents(0)
table.resizeRowToContents(1)

# 手动调整单元格大小
table.setColumnWidth(0, 300)
table.setColumnWidth(1, 150)
table.setRowHeight(0, 200)
table.setRowHeight(1, 100)

在这个例子中,我们使用了一个较大的图片和一个较小的图片,并演示了如何自适应单元格大小和列宽。我们还手动调整了单元格大小,以确保图片完全可见。

如果您不确定单元格的大小是否合适,您可以通过调用 sizeHint 方法来获取单元格的大小建议。例如:


size = item1.sizeHint()
print(size.width(), size.height())

# 加载图片并将其缩放到指定大小
width = 100 # 指定宽度
height = 100 # 指定高度
pixmap = QPixmap('path/to/image.jpg').scaled(width, height)
  1. 加载图片并获取其原始大小:
1
2
3
4
5
from PySide2.QtGui import QPixmap

pixmap = QPixmap('path/to/image.jpg')
width = pixmap.width()
height = pixmap.height()
  1. 创建 QTableWidgetItem 并将其添加到 QTableWidget:
1
2
3
4
5
from PySide2.QtWidgets import QTableWidgetItem

item = QTableWidgetItem()
item.setIcon(QIcon(pixmap))
tableWidget.setItem(row, col, item)
  1. 调整单元格大小以适应图片:
1
2
tableWidget.setRowHeight(row, height)
tableWidget.setColumnWidth(col, width)

如果您希望在 QTableWidgetItem 中保留原始大小的图片,可以使用 setFlags 方法将单元格的编辑标志设置为 Qt.ItemIsEnabled,这将防止用户编辑单元格和调整单元格大小:

1
item.setFlags(item.flags() ^ Qt.ItemIsEditable)

创建 QTableWidgetItem 并将其添加到单元格中

1
2
3
4
5
6
7
8
9
10
# 加载图片并获取其原始大小
pixmap = QPixmap('path/to/image.jpg')
width = pixmap.width()
height = pixmap.height()

item = QTableWidgetItem()
item.setIcon(QIcon(pixmap))
item.setFlags(item.flags() ^ Qt.ItemIsEditable) # 禁止编辑单元格
item.setTextAlignment(Qt.AlignCenter) # 居中对齐
tableWidget.setItem(0, 0, item)

调整单元格大小以适应图片

1
2
tableWidget.setRowHeight(0, height)
tableWidget.setColumnWidth(0, width)

设置单元格内容、对齐、属性

qt表格的单元格内的内容对象 是一个 单元格对象 QTableWidgetItem 实例

如果单元格 没有被设置过 内容,可以这样

1
2
3
4
5
from PySide2.QtWidgets import QTableWidgetItem

item = QTableWidgetItem()
item.setText('白月黑羽')
table.setItem(row, 0, item)

也可以简写为

1
2
3
from PySide2.QtWidgets import QTableWidgetItem

table.setItem(row, 0, QTableWidgetItem('白月黑羽'))

如果单元格 已经被设置过 文本内容,

item 方法可以获取指定位置的 QTableWidgetItem ,再调用这个对象的 setText 方法,就可以设置单元格文本内容,比如

1
table.item(0,0).setText('白月黑羽-江老师')

就设置了 第1行,第1列 的单元格里面的文本。

1
table.item(2,4).setText('白月黑羽-江老师')

就设置了 第3行,第5列 的单元格里面的文本。

如果希望某个单元格为 只读,不允许修改,可以使用QTableWidgetItem对象的 setFlags 方法,像这样

1
2
3
4
5
6
from PySide2.QtWidgets import QTableWidgetItem
from PySide2.QtCore import Qt

item = QTableWidgetItem('白月黑羽')
item.setFlags(Qt.ItemIsEnabled) # 参数名字段不允许修改
table.setItem(row, 0, item)

如果想文本内容 居中对齐,每个当对应的QTableWidgetItem 调用 setTextAlignment,如下

1
2
3
4
5
6
7
8
from PySide2.QtWidgets import QTableWidgetItem
from PySide2.QtCore import Qt

item = QTableWidgetItem()
item.setText('白月黑羽')
# 文本居中
item.setTextAlignment(Qt.AlignCenter)
table.setItem(row, 0, item)

如果想设置 表格框 和 单元格边线 的颜色,可以使用样式如下

1
2
3
4
QTableWidget {
border:1px solid green;
gridline-color: rgb(71, 191, 255);
}

获取单元格文本的内容

item 方法可以指定位置的单元格对象(QTableWidgetItem) ,再调用这个对象的 text 方法,就可以获取文本内容,比如

1
table.item(0,0).text()

就获取了 第1行,第1列 的单元格里面的文本。

1
table.item(2,4).text()

就获取了 第3行,第5列 的单元格里面的文本。

获取所有行数、列数

代码中可以使用 rowCount 方法来获取表格所有的 行数 ,比如

1
rowcount = table.rowCount()

可以使用 columnCount 方法来获取表格所有的 列数 ,比如

1
rowcount = table.columnCount()

获取当前选中是第几行

代码中可以使用 currentRow 方法来获取当前选中是第几行,比如

1
currentrow = table.currentRow()

注意:行数是从0开始的, 第一行的行数是 0

设置表格行数、列数

代码中可以使用 setRowCount 方法来设置表格 行数 ,比如

1
table.setRowCount(10)

代码中可以使用 setColumnCount 方法来设置表格 列数 ,比如

1
table.setColumnCount(10)

清除/删除所有内容

clearContents 方法可以清除表格所有的内容,比如

1
table.clearContents()

清除后,仍然会留下表格栏

如果连表格栏都要删除,可以使用 setRowCount(0),像这样

1
table.setRowCount(0)

设置表格自动对齐(不用手动拉伸)

1
2
from PySide2.QtWidgets import QHeaderView
table.tableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.ResizeMode.Stretch)

设定列宽、宽度自动缩放

Qt Designer 上目前没法拖拽设定 每个列的宽度,只能在代码中指定。

如下所示

1
2
3
4
5
# 设定第1列的宽度为 180像素
table.setColumnWidth(0, 180)

# 设定第2列的宽度为 100像素
table.setColumnWidth(1, 100)

如想让 表格控件宽度 随着父窗口的缩放自动缩放,可以

在 属性编辑器 中 勾选 HorizontalHeaderStretchLastSection

或者使用下面代码

1
2
tableHeader = table.horizontalHeader()
tableHeader.setStretchLastSection(True)

还可以像下面这样设置

信号:单元格内容改动

当用户修改了一个单元格的内容,会发出 cellChanged 信号,并且携带参数指明该单元格的行号和列号。

我们的代码可以对该信号进行相应的处理。

示例代码如下

1
2
3
4
5
6
7
8
9
def __init__(self):
# 指定单元格改动信号处理函数
self.ui.table.cellChanged.connect(self.cfgItemChanged)


def cfgItemChanged(self,row,column):
# 获取更改内容
cfgName = self.ui.table.item(row, 0).text() # 首列为配置名称
cfgValue = self.ui.table.item(row, column).text()