给QTableView中的一列添加按钮

我的需求是在QTableView里有一列全变为按钮,并且点击按钮可以返回该按钮所在行的其他数据或行号。

这里没有用QItemDelegate,感觉有点难而且理解起来不是那么透彻。在查询了一系列资料后发现一个很简单的方法且好用,前提是用了QStandardItemModel(),这个用来给QTableView加数据很方便。

比如:
table.cpp

init()
{
.....
    model = new QStandardItemModel();
    model->setColumnCount(4);
    //这些是列名
    model->setHeaderData(0, Qt::Horizontal, QString::fromLocal8Bit("文件名"));
    model->setHeaderData(1, Qt::Horizontal, QString::fromLocal8Bit("文件大小"));
    model->setHeaderData(
QTableView添加表头按钮,可以通过自定义表头视图来实现。步骤如下: 1. 继承QHeaderView类,创建自定义的表头视图类(例如MyHeaderView)。 2. 在自定义的表头视图类重写paintSection()函数,用于绘制表头的每个部分。 3. 在paintSection()函数判断绘制的是哪个部分,如果是最后一列,就绘制一个按钮。 4. 在重写的paintSection()函数,监听鼠标点击事件,当点击按钮时,发射一个信号。 5. 在使用QTableView的地方,使用自定义的表头视图类作为表头视图。 6. 在控制QTableView的类,连接自定义表头视图的信号到槽函数,实现按钮的功能。 以下是一个简单的例子来说明: ```python from PyQt5.QtWidgets import QTableView, QApplication, QMainWindow, QHeaderView, QWidget, QVBoxLayout, QPushButton from PyQt5.QtCore import Qt, QAbstractTableModel, QModelIndex from PyQt5.QtGui import QPainter class MyHeaderView(QHeaderView): def paintSection(self, painter, rect, logicalIndex): # 绘制表头的每个部分 painter.save() painter.drawText(rect, Qt.AlignCenter, self.model().headerData(logicalIndex, Qt.Horizontal)) painter.restore() # 如果是最后一列,绘制一个按钮 if logicalIndex == self.model().columnCount() - 1: painter.save() buttonRect = rect.adjusted(10, 5, -10, -5) painter.drawRoundedRect(buttonRect, 5, 5) painter.drawText(buttonRect, Qt.AlignCenter, "按钮") painter.restore() def mousePressEvent(self, event): # 监听鼠标点击事件 for logicalIndex in range(self.model().columnCount()): rect = self.sectionRect(logicalIndex) if rect.contains(event.pos()): if logicalIndex == self.model().columnCount() - 1: # 点击了最后一列按钮 self.sectionClicked.emit(logicalIndex) return super().mousePressEvent(event) class MyTableModel(QAbstractTableModel): def __init__(self): super().__init__() self.data = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] def rowCount(self, parent=QModelIndex()): return len(self.data) def columnCount(self, parent=QModelIndex()): return len(self.data[0]) def data(self, index, role=Qt.DisplayRole): if role == Qt.DisplayRole: return str(self.data[index.row()][index.column()]) return None def headerData(self, section, orientation, role=Qt.DisplayRole): if role == Qt.DisplayRole: if orientation == Qt.Horizontal: return f"列{section}" if orientation == Qt.Vertical: return f"行{section+1}" return None class MainWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("QTableView表头添加按钮") self.resize(300, 200) self.tableView = QTableView() self.tableView.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch) # 设置自定义的表头视图 headerView = MyHeaderView(Qt.Horizontal, self.tableView) self.tableView.setHorizontalHeader(headerView) # 连接自定义表头视图的信号到槽函数 headerView.sectionClicked.connect(self.onHeaderButtonClicked) # 设置数据模型 model = MyTableModel() self.tableView.setModel(model) self.setCentralWidget(self.tableView) def onHeaderButtonClicked(self, logicalIndex): print(f"点击了第{logicalIndex+1}列的按钮") if __name__ == "__main__": import sys app = QApplication(sys.argv) mainWindow = MainWindow() mainWindow.show() sys.exit(app.exec_()) ``` 以上是一个简单的示例,实现了在QTableView的表头添加了一个按钮。点击按钮时,会打印出对应的列号。根据自己的需要,可以进一步定制按钮的外观和功能。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值