pyside6 QtableView单元格显示按钮

默认的代理是不显示按钮,需要双击单元格后才显示。

from PySide6.QtWidgets import QApplication, QTableView, QPushButton, QStyledItemDelegate, QSizePolicy, QStyleOptionViewItem
from PySide6.QtCore import Qt, QModelIndex, QEvent
from PySide6.QtGui import QStandardItemModel, QStandardItem

class ButtonDelegate(QStyledItemDelegate):
    def __init__(self, parent=None):
        super(ButtonDelegate, self).__init__(parent)

    def createEditor(self, parent, option, index):
        # 创建一个按钮作为编辑器
        pass
        # button = QPushButton('点击', parent)
        # button.clicked.connect(lambda: self._buttonClicked(index))
        # return button

    # def setEditorData(self, editor, index):
    #     # 设置按钮的数据,这里可以根据需要调整
    #     pass

    # def setModelData(self, editor, model, index):
    #     # 将按钮的状态保存回模型,如果有必要的话
    #     pass

    # def _buttonClicked(self, index):
    #     print(f"Button clicked at row {index.row()}, column {index.column()}")

    def paint(self, pai
PySide6 中,`QTableWidget` 是一个用于展示二维表格数据的控件。它允许用户以行和列的形式组织和编辑数据,并支持自定义单元格内容、样式以及交互操作。以下是一个详细的使用教程和示例。 ### 基本用法 #### 创建 `QTableWidget` 可以通过直接实例化 `QTableWidget` 来创建一个表格控件。可以指定行数和列数,也可以通过后续方法动态调整。 ```python from PySide6.QtWidgets import QApplication, QWidget, QVBoxLayout, QTableWidget, QTableWidgetItem app = QApplication(sys.argv) window = QWidget() layout = QVBoxLayout(window) # 创建一个 3 行 2 列的表格 table_widget = QTableWidget(3, 2) layout.addWidget(table_widget) # 设置表头 table_widget.setHorizontalHeaderLabels(["列1", "列2"]) # 填充数据 for row in range(3): for col in range(2): item = QTableWidgetItem(f"行{row+1},列{col+1}") table_widget.setItem(row, col, item) window.setLayout(layout) window.show() sys.exit(app.exec()) ``` #### 添加行或列 可以通过 `insertRow()` 和 `insertColumn()` 方法动态添加行或列。 ```python # 添加一行 table_widget.insertRow(table_widget.rowCount()) # 添加一列 table_widget.insertColumn(table_widget.columnCount()) ``` #### 删除行或列 可以使用 `removeRow()` 和 `removeColumn()` 方法删除特定行或列。 ```python # 删除最后一行 table_widget.removeRow(table_widget.rowCount() - 1) # 删除最后一列 table_widget.removeColumn(table_widget.columnCount() - 1) ``` ### 自定义单元格内容 除了文本,还可以在单元格中放置其他控件,如按钮、复选框等。 #### 放置按钮单元格 可以通过 `setCellWidget()` 方法将控件嵌入单元格。 ```python from PySide6.QtWidgets import QPushButton button = QPushButton("点击") table_widget.setCellWidget(0, 1, button) ``` #### 单元格样式设置 可以通过 `QTableWidgetItem` 的 `setBackground()` 和 `setFont()` 等方法设置单元格背景颜色或字体。 ```python item = QTableWidgetItem("高亮单元格") item.setBackground(Qt.red) table_widget.setItem(1, 0, item) ``` ### 信号与槽 `QTableWidget` 提供了多种信号,例如 `cellClicked()` 和 `cellChanged()`,可用于实现交互逻辑。 ```python def on_cell_clicked(row, col): print(f"点击了第 {row+1} 行,第 {col+1} 列") table_widget.cellClicked.connect(on_cell_clicked) ``` ### 完整示例代码 以下是包含上述功能的完整示例: ```python import sys from PySide6.QtWidgets import QApplication, QWidget, QVBoxLayout, QTableWidget, QTableWidgetItem, QPushButton from PySide6.QtCore import Qt def on_cell_clicked(row, col): print(f"点击了第 {row+1} 行,第 {col+1} 列") app = QApplication(sys.argv) window = QWidget() layout = QVBoxLayout(window) # 创建一个表格 table_widget = QTableWidget(3, 2) table_widget.setHorizontalHeaderLabels(["列1", "列2"]) table_widget.cellClicked.connect(on_cell_clicked) # 填充数据 for row in range(3): for col in range(2): item = QTableWidgetItem(f"行{row+1},列{col+1}") table_widget.setItem(row, col, item) # 添加按钮单元格 button = QPushButton("点击我") table_widget.setCellWidget(0, 1, button) # 添加一行 table_widget.insertRow(table_widget.rowCount()) item = QTableWidgetItem("新行数据") table_widget.setItem(table_widget.rowCount()-1, 0, item) # 设置单元格样式 highlight_item = QTableWidgetItem("高亮单元格") highlight_item.setBackground(Qt.yellow) table_widget.setItem(1, 1, highlight_item) layout.addWidget(table_widget) window.setLayout(layout) window.setWindowTitle("QTableWidget 示例") window.resize(400, 300) window.show() sys.exit(app.exec()) ``` ### 注意事项 - `QTableWidget` 是基于模型的控件,适合处理较小的数据集。如果需要处理大量数据,建议使用 `QTableView` 结合 `QStandardItemModel`。 - 单元格内容可以通过 `setItem()` 或 `setCellWidget()` 进行设置,但需要注意内存管理和性能问题。 - 可以通过 `horizontalHeader()` 和 `verticalHeader()` 调整表头样式或行为。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值