在使用QStandardItem时,可以通过自定义委托(Delegate)来实现在单元格中添加小按钮。以下是一个示例代码:
#include <QApplication>
#include <QStandardItemModel>
#include <QStandardItem>
#include <QTableView>
#include <QPushButton>
#include <QDebug>
class ButtonDelegate : public QStyledItemDelegate
{
Q_OBJECT
public:
explicit ButtonDelegate(QObject *parent = nullptr) : QStyledItemDelegate(parent) {}
QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override
{
if (index.column() == 0) // 只有第一列显示按钮
{
QPushButton *button = new QPushButton("Click", parent);
connect(button, &QPushButton::clicked, this, [index]() {
qDebug() << "Button clicked at index:" << index.row();
});
return button;
}
return QStyledItemDelegate::createEditor(parent, option, index);
}
void setEditorData(QWidget *editor, const QModelIndex &index) const override
{
if (QPushButton *button = qobject_cast<QPushButton *>(editor))
{
button->setText(index.data(Qt::DisplayRole).toString());
}
else
{
QStyledItemDelegate::setEditorData(editor, index);
}
}
void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override
{
if (QPushButton *button = qobject_cast<QPushButton *>(editor))
{
model->setData(index, button->text(), Qt::DisplayRole);
}
else
{
QStyledItemDelegate::setModelData(editor, model, index);
}
}
void updateEditorGeometry(QWidget *editor,
const QStyleOptionViewItem &option,
const QModelIndex &index) const override
{
editor->setGeometry(option.rect);
}
};
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QStandardItemModel model(4, 2); // 创建一个4行2列的模型
// 设置表头
model.setHeaderData(0, Qt::Horizontal, "按钮");
model.setHeaderData(1, Qt::Horizontal, "文本");
// 添加数据和按钮
for (int row = 0; row < 4; ++row)
{
QModelIndex index = model.index(row, 0);
model.setData(index, QString("按钮%1").arg(row + 1), Qt::DisplayRole);
index = model.index(row, 1);
model.setData(index, QString("文本%1").arg(row + 1), Qt::DisplayRole);
}
QTableView tableView;
tableView.setModel(&model);
ButtonDelegate delegate;
tableView.setItemDelegateForColumn(0, &delegate); // 第一列使用自定义委托
tableView.show();
return app.exec();
}
#include "main.moc"
此示例中,通过自定义ButtonDelegate
继承自QStyledItemDelegate
,在单元格中创建了一个名为”Click”的QPushButton,并与clicked信号连接。当点击按钮时,会打印出相应的行索引。
这样就可以在QStandardItem中添加一个小按钮了。你可以根据需要进行修改和适配。
内容由零声教学AI助手提供,问题来源于学员提问