Qt - 替换QAbstractItemModel中的一行(绑定到QTableView)

时间:2014-03-14 02:54:11

标签: qt

每当我使用以下方法更改行中的数据时,我的QTableView显示一个额外的空行有问题:

beginInsertRows(QModelIndex(), rowCount(), rowCount());
listOfObjects.replace(i, *object);
endInsertRows();

我把它改成了这个,但是看起来非常h​​acky。

beginRemoveRows(QModelIndex(), rowCount(), rowCount());
beginInsertRows(QModelIndex(), rowCount(), rowCount());
listOfObjects.replace(i, *object);
endInsertRows();
endRemoveRows();

有没有更好的方法来实现这一目标?

由于

1 个答案:

答案 0 :(得分:1)

这是一个简单的例子。 让我们创建一个自定义表模型:

class MyModel : public QAbstractTableModel
{
    Q_OBJECT
public:
    explicit MyModel(int rows, int cols, QObject *parent = 0);

    int rowCount(const QModelIndex &parent = QModelIndex()) const;
    int columnCount(const QModelIndex &parent = QModelIndex()) const;

    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;

    void updateRow(int row);

private:
    int m_rows, m_cols;
    QMap<int, QMap<int, QString> > updatedItems;
};

它具有updateRow功能,可将项目文本从“清除”更改为“更新”和QMap更新项目。

MyModel::MyModel(int rows, int cols, QObject *parent) :
    QAbstractTableModel(parent),
    m_rows(rows),
    m_cols(cols)
{
}

int MyModel::rowCount(const QModelIndex &parent) const
{
    return m_rows;
}

int MyModel::columnCount(const QModelIndex &parent) const
{
    return m_cols;
}

QVariant MyModel::data(const QModelIndex &index, int role) const
{
    QVariant res;

    if (role == Qt::DisplayRole)
    {
        int row = index.row();
        int col = index.column();

        QString text;

        if (updatedItems.contains(row))
        {
            QMap<int, QString> colData = updatedItems.value(row);
            if (colData.contains(col))
            {
                text = colData.value(col);
            }
        }

        if (text.isEmpty())
        {
            text = QString("clean %1 - %2").arg(row).arg(col);
        }

        res = text;
    }

    return res;
}

void
MyModel::updateRow(int row)
{
    if (updatedItems.contains(row) == false)
    {
        updatedItems[row] = QMap<int, QString>();
    }

    for (int col = 0; col < m_cols; ++col)
    {
        QString text = QString("update %1 - %2").arg(row).arg(col);
        updatedItems[row].insert(col, text);
    }

    QModelIndex index1 = index(row, 0);
    QModelIndex index2 = index(row, m_cols - 1);

    emit dataChanged(index1, index2);
}

检查最后一个函数发出dataChanged信号的方式。

以下是您可以使用该模型的方法:

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    QVBoxLayout *layout = new QVBoxLayout(this);

    QPushButton *btn = new QPushButton("update");
    view = new QTableView;

    model = new MyModel(4, 5, view);
    view->setModel(model);

    layout->addWidget(btn);
    layout->addWidget(view);

    connect(btn, SIGNAL(clicked()), this, SLOT(updateRowData()));

    resize(400, 300);
}

void Widget::updateRowData()
{
    QModelIndex index = view->currentIndex();
    if (index.isValid())
    {
        int row = index.row();

        model->updateRow(row);
    }
}