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_()