QTableView не реагирует на сигнал dataChanged - PullRequest
1 голос
/ 08 января 2012

Ниже показана моя пользовательская модель стола.Я пытаюсь использовать эту табличную модель вместе с QTableView.Если вызывается метод добавления таблицы, я ожидаю, что табличное представление обновит свое содержимое.Но это не так, и я не знаю почему.Однако, если я использую ту же модель таблицы вместе с QListView, все работает нормально, то есть представление списка обновляет свое содержимое, когда вызывается добавление модели таблицы.Что-нибудь особенное, что мне нужно сделать в случае QTableView?

class MyModel : public QAbstractTableModel
{
public:

    MyModel(QObject* parent=NULL) : QAbstractTableModel(parent) {}

    int rowCount(const QModelIndex &parent = QModelIndex()) const {
        return mData.size();
    }

    int columnCount(const QModelIndex &parent = QModelIndex()) const {
        return 2;
    }

    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const {
        if (!index.isValid()) {
            return QVariant();
        }

        if (role == Qt::DisplayRole) {
            if (index.column()==0) {
                return QVariant(QString::fromStdString(getFirst(index.row())));
            }
            if (index.column()==1) {
                return QVariant(QString::fromStdString(getSecond(index.row())));
            }
        }

        return QVariant();
    }

    void append(std::string const& first, std::string const& second) {
        mData.push_back(std::make_pair(first, second));

        emit dataChanged(index(mData.size()-1, 0), index(mData.size()-1, 1));
    }

    std::string const& getFirst(int i) const {
        return mData[i].first;
    }

    std::string const& getSecond(int i) const {
        return mData[i].second;
    }

protected:

    std::vector<std::pair<std::string, std::string> > mData;
};

1 Ответ

3 голосов
/ 09 января 2012

Когда вы вставляете новую строку вместо того, чтобы изменять существующие данные, вы должны использовать вместо них beginInsertRows и endInsertRows:

void append(std::string const& first, std::string const& second) {
    int row = mData.size();
    beginInsertRows( QModelIndex(), row, row );

    mData.push_back(std::make_pair(first, second));

    endInsertRows();
}

Посмотрите, поможет ли это.

...