我已经对 QAbstractTableModel 和 QTabelView(以及 QSortFilterProxyModel)进行了子类化,我希望允许用户在文本单元格中显示和输入多行文本(目前,点击回车将确认编辑而不是插入一行休息)。
应该设置一些简单的标志,我只是不知道是哪个...
最佳答案
QItemDelegate
实际上可以在多行上绘制文本(如果它包含明确的 '\n' 字符),而默认的 QStyledItemDelegate
不会这样做(至少不在 Linux 上,我没有测试其他平台)。所以我们需要使用 QItemDelegate
进行渲染。
但是我们还需要更改用于编辑的小部件,不能再是QLineEdit
,它需要是QPlainTextEdit
。所以我们必须派生自 QItemDelegate
并更改正在创建的用于编辑的小部件的类型。
#ifndef MULTILINEDELEGATE_H
#define MULTILINEDELEGATE_H
#include <QItemDelegate>
class MultilineDelegate : public QItemDelegate
{
Q_OBJECT
public:
using QItemDelegate::QItemDelegate;
public:
QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override;
void setEditorData(QWidget *editor, const QModelIndex &index) const override;
void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override;
};
#endif
#include "multilinedelegate.h"
#include <QPlainTextEdit>
QWidget *MultilineDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
Q_UNUSED(option);
Q_UNUSED(index);
return new QPlainTextEdit(parent);
}
void MultilineDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
if (auto *textEdit = qobject_cast<QPlainTextEdit *>(editor)) {
textEdit->setPlainText(index.data(Qt::EditRole).toString());
} else {
QItemDelegate::setEditorData(editor, index);
}
}
void MultilineDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
if (auto *textEdit = qobject_cast<QPlainTextEdit *>(editor)) {
model->setData(index, textEdit->toPlainText());
} else {
QItemDelegate::setModelData(editor, model, index);
}
}
现在剩下要做的就是在适当的列上使用该委托(delegate)。例如 tableView->setItemDelegateForColumn(MyModel::AddressColumn, new MultilineDelegate(this));
如果行按需要垂直增长,这看起来也会更好:
tableView->verticalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
已使用 Qt 5.15 进行测试,希望它也适用于 Qt 6。
关于c++ - 如何在 QTableView/QAbstractTableModel 中使用多行文本/换行符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11604194/