c++ - 如何在 QTableView/QAbstractTableModel 中使用多行文本/换行符?

标签 c++ qt qtableview line-breaks qabstracttablemodel

我已经对 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/

相关文章:

Qt 模型/ View 与标准小部件

c++ - c++中的 vector 下标超出范围错误

C++内存泄漏对象通过函数返回

c++ - 我可以使 C++11 类/对象普遍线程安全吗?

javascript - 如何创建 QChart.js 折线图

c++ - 用一个整数连接两个 QString

qt - 如何找到文本光标的全局位置?

python - QTableview指定标准搜索字段

c++ - 如何在 QTableView 中打开一个 URL

c++ - SDL2加载特殊字 rune 件