QTableView似乎对数据没有反应信号更改



下面显示的是我的自定义表模型。我正在尝试将该表模型与QTableView一起使用。如果调用表模型的方法append,我希望表视图更新其内容。但事实并非如此,我也不知道为什么。然而,如果我将同一个表模型与QListView一起使用,则一切都很好,即当调用表模型的append时,列表视图确实会更新其内容。在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;
};

当您插入新行而不是更改现有数据时,您应该使用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();
}

看看这是否有帮助。

最新更新