3

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

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

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

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

主窗口.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())并从那里发出数据更改(使用发出 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:
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;
}
4

2 回答 2

1

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

于 2016-05-14T08:53:41.107 回答
1

我得到了它...

connect(transposeButton, &QPushButton::clicked, [model]() {
    beginResetModel();
    m(0,0)=50;
    endResetModel();
});

有效...模型已经是一个指针,所以我将相同的指针指向 lambda 函数。现在我只需要弄清楚我的转置功能有什么问题,因为这仍然无法正常工作,但是崩溃已经消失了:P 谢谢您的建议 :)

于 2016-05-14T23:56:37.327 回答