c++ - 如何彻底改变 QAbstractTableModel 的底层数据?

标签 c++ qt templates qtableview qabstracttablemodel

这是我在这里的第一篇文章,但自从我开始编程以来,我得到了你们所有人的很多帮助。

我是 Qt 的新手,目前正在尝试制作我的第一个项目。我的问题是关于模型、底层数据和 View 之间的通信。

我首先将后台事物(数据存储等)与 GUI 分开。 现在我有一个模板类Matrix,我写了一个模板类MatrixModel,它继承自QAbstractTableModel。这工作正常,意味着我可以编辑表格,并在 View 和模型数据中刷新值。

现在我的问题是:如何在不编写新方法的情况下更改模型中的数据?

主窗口.cpp:

matrix<int> m = {{1,2,3},{4,5,6},{7,8,9}};
MatrixModel<int>* model = new MatrixModel<int>(m);
QTableView* tableView = new QTableView;
tableView->setModel(model);

有什么方法可以调用m.transpose() 来获取模型的底层数据吗?如果我更改 m 会怎样?它会影响模型的数据吗?我尝试了很多东西,但没有任何效果。一个“问题”是我无法使用标准信号/槽语法,因为我正在使用模板类。

我最后一次尝试是在模型中创建一个更新类:

template<typename T>
void MatrixModel<T>::updateAll() {
    QModelIndex topLeft = index(0,0);
    QModelIndex bottomRight = index(rowCount()-1, columnCount()-1);
    emit dataChanged(topLeft, bottomRight);
}

我试着用一个按钮和一个 lambda 函数连接它:

connect(transposeButton, &QPushButton::clicked, [=,&m,&model]() {
m.transpose(); model->updateAll();
});

但是如果我按下按钮,那似乎会使我的程序崩溃。我真的很绝望 xD 希望你能帮助我。如果您需要更多信息,请询问^^

最好的问候

丹尼斯

编辑 1:好的,到目前为止我想通了(在你的帮助下 :)),我必须在模型中再次编写矩阵的函数(例如 transpose())并从那里发出数据变化(使用 emit dataChanged或 beginResetModel()...) 但我无法修改底层数据的模型。如果我写

这在主窗口中:

connect(transposeButton, &QPushButton::clicked, [&model]() {
    model->transpose();
});

模型中的这个:

template<typename T>
void MatrixModel<T>::transpose() {
    m(0,0) = 5;
}

如果我按下转置按钮,我的程序就会崩溃。如果我评论这一行

m(0,0) = 5;

出来,一切正常。

编辑 2: 可能数据存储有问题,所以这是我的复制构造函数和我的矩阵类的私有(private)变量:

private:
std::vector <T> data;
size_t rows, columns;

//Copy constructor
template<typename T>
matrix<T>::matrix(const matrix<T>& other)
    : rows(other.rows), columns(other.columns) {
    data = other.data;
}

最佳答案

您应该将 matrix 变量作为模型中的私有(private)成员,以便对 matrix 的所有编辑都应该通过模型中的函数完成。这意味着您的模型将有一个公共(public) transpose 函数,该函数在您的 matrix 数据上调用 transpose 然后发出 dataChanged()信号。而且您不应该直接访问您的矩阵,因为在模型不知情的情况下更改它不会提供您想要的结果。这样,每次更改 matrix 变量后调用 updateAll 就不是您的责任,因为您的模型进行了更改并相应地更新了自身。 . .

关于c++ - 如何彻底改变 QAbstractTableModel 的底层数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37217049/

相关文章:

c++ - bada 编程 - 滚动面板不显示所有 editFields

c++ - 什么是 _WIN32_WINNT,它是如何工作的?

qt - qt_creator 中的一个错误

C++ 模板转换运算符 - 请求从 到非标量类型的转换

javascript - 无法在 ng-repeat 中动态 ng-include angular 模板

c++ - 使用 glOrtho 进行滚动游戏。宇宙飞船 "shudders"

java - 如何从正在使用的文件中读取

c++ - 在QTreeWidget中排序时的调试断言(无效的比较器)

c++ - _BLOCK_TYPE_IS_VALID(pHead->nBlockUse) 在 C++ 中崩溃

html - vbulletin 4.2.1 如何通过html和css创建模板