2

我有一个数据矩阵,我只是将它存储为 QStringLists 的 QList,所有这些都包含相同数量的 QStrings。这样,数据看起来几乎就像一个电子表格。

我使用 QTableView 将这些数据呈现给用户:

void DialogwitQTableView::setData(QList<QStringList> s)
{
    /* Create the data model */
    // 1. give it some headers
    QStandardItemModel model = new QStandardItemModel(s.count(),25,this); //x Rows and 25 Columns
    model->setHorizontalHeaderItem(0, new QStandardItem(QString("Column 1")));
    model->setHorizontalHeaderItem(1, new QStandardItem(QString("Column 2")));
     // ...
    model->setHorizontalHeaderItem(24, new QStandardItem(QString("Column 25")));

    // 2. populate the model with the data

    for(int i = 0; i < s.count() ; i++)
    {
        for(int j = 0; j < s[i].count() ; j++)
            model->setItem(i,j,new QStandardItem(QString(s[i][j])));
    }
    ui->NameOfTheTableView->setModel(model);
}

现在,如果用户想要更改一些数据,他只需双击对话框中的 QTableView 并编辑他想要的内容。

我如何在数据中也获得该编辑?如何使用该新信息调整 QStringList?

如果我搜索文档,我主要会找到链接到数据库的 QTableView,但我看不出这将如何与内存中的简单数据结构一起工作。如果我转到 QtDesigner 并单击 TableView 的“转到插槽”,我也看不到名为“datachanged”的插槽或类似的东西。

有什么想法吗?我觉得很困,我可能正在概述一些东西,非常欢迎任何提示。

4

3 回答 3

2

看文档,一个QTableView继承了QAbstractItemView的6个信号

http://doc.qt.digia.com/qt/qabstractitemview.html#signals

此类具有用于捕获编辑和编辑触发器的各种功能。

一旦您可以捕捉到数据何时更改,如果您使用的是 MVC 视图,您可以将其重新提交回您的模型。我相信有很多例子。

希望有帮助。

于 2012-12-16T01:21:18.423 回答
1

如果我搜索文档,我主要会找到链接到数据库的 QTableView,但我看不出这将如何与内存中的简单数据结构一起工作。

QTableView是 Qt 的模型/视图框架的一部分。有很多模型视图的例子。

我如何在数据中也获得该编辑?如何使用该新信息调整 QStringList?

至少存在以下解决方案:

  1. QStandardItemModel您可以通过item方法获取所有数据。

  2. 连接到QStandardItemModel::itemChanged信号。

  3. 您可以通过子类化创建自己的模型(我建议基于QAbstractTableModel)并实现几种方法(data, setData+ 几种实用方法)。

于 2012-12-16T01:31:43.197 回答
1

我认为对于更复杂的情况,最好使用抽象类,在这种情况下更具体地说是 QAbstractTableModel。

查看这个文件,我只是将 Contact 替换为 StringList 并更改了 getter 和 setter。看看这个:

https://doc.qt.io/qt-5/qtwidgets-itemviews-addressbook-tablemodel-cpp.html

TableModel::TableModel(QObject *parent) : 
    QAbstractTableModel(parent)
{
}

TableModel::TableModel(QList<QStringList> stringLists, QObject *parent) : 
    QAbstractTableModel(parent), 
    stringLists(stringLists)
{
}

int TableModel::rowCount(const QModelIndex &parent) const
{
    Q_UNUSED(parent);
    return stringLists.size();
}

int TableModel::columnCount(const QModelIndex &parent) const
{
    Q_UNUSED(parent);
    return 2; // put the amount of columns here
}

QVariant TableModel::data(const QModelIndex &index, int role) const
{
    if (!index.isValid()) return QVariant();

    if (index.row() >= stringLists.size() || index.row() < 0)  return QVariant();

    if (role == Qt::DisplayRole) {
        const auto &strings = stringLists.at(index.row());

        if (index.column() == 0)
            return strings[0];
        else if (index.column() == 1)
            return strings[1];
    }
    return QVariant();
}
QVariant TableModel::headerData(int section, Qt::Orientation orientation, int role) const
{
    if (role != Qt::DisplayRole)
        return QVariant();

    if (orientation == Qt::Horizontal) {
        switch (section) {
            case 0:
                return tr("String 1");

            case 1:
                return tr("String 2");

            default:
                return QVariant();
        }
    }
    return QVariant();
}

bool TableModel::insertRows(int position, int rows, const QModelIndex &index)
{
    Q_UNUSED(index);
    beginInsertRows(QModelIndex(), position, position + rows - 1);

    for (int row = 0; row < rows; ++row)
        stringLists.insert(position, { QString(), QString() });

    endInsertRows();
    return true;
}

bool TableModel::removeRows(int position, int rows, const QModelIndex &index)
{
    Q_UNUSED(index);
    beginRemoveRows(QModelIndex(), position, position + rows - 1);

    for (int row = 0; row < rows; ++row)
        stringLists.removeAt(position);

    endRemoveRows();
    return true;
}
bool TableModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
    if (index.isValid() && role == Qt::EditRole) {
        int row = index.row();

        auto strings = stringLists.at(row);

        if (index.column() == 0)
            strings[0] = value.toString();
        else if (index.column() == 1)
            contact[1] = value.toString();
        else
            return false;

        stringLists.replace(row, contact);
        emit dataChanged(index, index, {role});

        return true;
    }

    return false;
}
Qt::ItemFlags TableModel::flags(const QModelIndex &index) const
{
    if (!index.isValid()) return Qt::ItemIsEnabled;

    return QAbstractTableModel::flags(index) | Qt::ItemIsEditable;
}

QList<QStringList> TableModel::getStringLists() const
{
    return stringLists;
}

我还强烈建议您阅读以下内容: https ://doc.qt.io/qt-5/modelview.html

希望能帮助到你。

于 2019-06-10T14:53:51.243 回答