152 lines
5.8 KiB
Python
152 lines
5.8 KiB
Python
from PyQt5.QtWidgets import *
|
|
from PyQt5.QtCore import *
|
|
|
|
|
|
class ButtonCellWidget(QWidget):
|
|
def __init__(self, parent=None):
|
|
super(ButtonCellWidget, self).__init__(parent)
|
|
|
|
self.layout = QHBoxLayout()
|
|
|
|
self.update_band_button = QPushButton("更新手环")
|
|
self.update_button = QPushButton("更新")
|
|
self.delete_button = QPushButton("删除")
|
|
|
|
self.layout.addWidget(self.update_band_button)
|
|
self.layout.addWidget(self.update_button)
|
|
self.layout.addWidget(self.delete_button)
|
|
|
|
self.setLayout(self.layout)
|
|
|
|
|
|
class MainWindow(QMainWindow):
|
|
def __init__(self, parent=None):
|
|
super(MainWindow, self).__init__(parent)
|
|
desktop = QDesktopWidget()
|
|
screenRect = desktop.availableGeometry()
|
|
self.resize(screenRect.width(), screenRect.height()) # 设置容器大小为屏幕大小
|
|
|
|
self.setWindowTitle("从接口获取数据的表格示例")
|
|
|
|
# 创建一个垂直布局
|
|
main_layout = QVBoxLayout()
|
|
|
|
# 创建按钮栏
|
|
button_widget = QWidget()
|
|
button_layout = QHBoxLayout()
|
|
button_widget.setLayout(button_layout)
|
|
|
|
self.select_all_button = QPushButton("全选")
|
|
self.deselect_all_button = QPushButton("非全选")
|
|
self.add_button = QPushButton("添加")
|
|
self.delete_button = QPushButton("删除")
|
|
|
|
button_layout.addWidget(self.select_all_button)
|
|
button_layout.addWidget(self.deselect_all_button)
|
|
button_layout.addWidget(self.add_button)
|
|
button_layout.addWidget(self.delete_button)
|
|
|
|
main_layout.addWidget(button_widget)
|
|
|
|
self.table_widget = QTableWidget()
|
|
main_layout.addWidget(self.table_widget)
|
|
|
|
self.setCentralWidget(QWidget())
|
|
self.centralWidget().setLayout(main_layout)
|
|
|
|
# 模拟添加 100 条数据
|
|
data = []
|
|
for i in range(100):
|
|
row_data = {
|
|
"name": f"姓名{i}",
|
|
"id": i + 1,
|
|
"class": f"班级{i}",
|
|
"gender": "男" if i % 2 == 0 else "女",
|
|
"band_id": f"手环编号{i}"
|
|
}
|
|
data.append(row_data)
|
|
|
|
# 设置表格的列名
|
|
column_names = ['', '姓名', '编号', '班级', '性别', '手环编号', '操作']
|
|
self.table_widget.setColumnCount(len(column_names))
|
|
self.table_widget.setHorizontalHeaderLabels(column_names)
|
|
|
|
# 设置表头样式
|
|
header = self.table_widget.horizontalHeader()
|
|
header.setStyleSheet("""
|
|
QHeaderView::section {
|
|
background-color: #f5f7fa;
|
|
border-top: none;
|
|
border-left: none;
|
|
border-right: 1px solid #d8d8d8;
|
|
border-bottom: 1px solid #d8d8d8;
|
|
font: 600 20px 'Microsoft YaHei UI';
|
|
}
|
|
""")
|
|
|
|
# 设置行数并填充数据
|
|
self.table_widget.setRowCount(len(data))
|
|
for row_index, row_data in enumerate(data):
|
|
# 添加复选框
|
|
check_box = QCheckBox()
|
|
# 创建一个新的 QWidget 来容纳复选框并使其居中
|
|
check_box_widget = QWidget()
|
|
check_box_layout = QHBoxLayout(check_box_widget)
|
|
check_box_layout.addWidget(check_box, alignment=Qt.AlignCenter)
|
|
self.table_widget.setCellWidget(row_index, 0, check_box_widget)
|
|
check_box.stateChanged.connect(lambda state, row=row_index: self.print_row_info(state, row))
|
|
|
|
for col_index, col_name in enumerate(column_names[1:]):
|
|
if col_name == '姓名':
|
|
value = row_data['name']
|
|
elif col_name == '编号':
|
|
value = str(row_data['id'])
|
|
elif col_name == '班级':
|
|
value = row_data['class']
|
|
elif col_name == '性别':
|
|
value = row_data['gender']
|
|
elif col_name == '手环编号':
|
|
value = row_data['band_id']
|
|
elif col_name == '操作':
|
|
widget = ButtonCellWidget()
|
|
self.table_widget.setCellWidget(row_index, col_index + 1, widget)
|
|
value = ""
|
|
item = QTableWidgetItem(value)
|
|
item.setTextAlignment(Qt.AlignCenter) # 设置文字居中
|
|
self.table_widget.setItem(row_index, col_index + 1, item)
|
|
|
|
self.table_widget.setStyleSheet(
|
|
"font: 18px \"Microsoft YaHei UI\";"
|
|
)
|
|
|
|
# 使表格宽度撑满屏幕
|
|
# self.table_widget.horizontalHeader().setStretchLastSection(True)
|
|
self.table_widget.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
|
|
|
|
# 设置第一列宽度为 50px
|
|
self.table_widget.horizontalHeader().setSectionResizeMode(0, QHeaderView.Fixed)
|
|
self.table_widget.setColumnWidth(0, 50)
|
|
# 设置最后一列宽度为 200px
|
|
self.table_widget.horizontalHeader().setSectionResizeMode(len(column_names) - 1, QHeaderView.Fixed)
|
|
self.table_widget.setColumnWidth(len(column_names) - 1, 500)
|
|
|
|
# 使表格行高和列宽自适应
|
|
# self.table_widget.horizontalHeader().setSectionResizeMode(QHeaderView.ResizeToContents)
|
|
# self.table_widget.verticalHeader().setSectionResizeMode(QHeaderView.ResizeToContents)
|
|
self.table_widget.verticalHeader().setDefaultSectionSize(50)
|
|
|
|
def print_row_info(self, state, row):
|
|
if state == Qt.Checked:
|
|
row_data = {}
|
|
for col_index in range(self.table_widget.columnCount()):
|
|
item = self.table_widget.item(row, col_index)
|
|
if item:
|
|
row_data[self.table_widget.horizontalHeaderItem(col_index).text()] = item.text()
|
|
print(row_data)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
app = QApplication([])
|
|
window = MainWindow()
|
|
window.show()
|
|
app.exec_() |