Это мой первый пост здесь, но я получил большую помощь от всех вас, ребята, так как я начал программировать.
Я новичок в Qt и сейчас пытаюсь сделать свой первый проект. Мой вопрос касается связи между моделью, базовыми данными и представлением.
Сначала я отделил фоновые вещи (хранение данных и т. д.) от графического интерфейса. Теперь у меня есть класс шаблона 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);
}
и я попытался подключить его с помощью кнопки и лямбда-функции:
connect(transposeButton, &QPushButton::clicked, [=,&m,&model]() {
m.transpose(); model->updateAll();
});
но это, похоже, привело к сбою моей программы, если я нажму кнопку. Я действительно в отчаянии xD Надеюсь, вы можете мне помочь. Если вам нужна дополнительная информация, просто спросите ^^
Наилучшие пожелания
Деннис
РЕДАКТИРОВАТЬ 1: Хорошо, пока я понял (с вашей помощью :)), что мне нужно снова написать функции матрицы в модели (например, транспонировать()) и выдать изменения данных оттуда (с помощью 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:
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;
}
dataChanged()
недостаточно. Вы должны вызватьbeginResetModel()
перед изменением данных, а затем вызватьendResetModel()
, когда закончите. . . - person Mike   schedule 14.05.2016transpose()
, а затем просто испускание сигналаdataChanged()
может привести к сбоям и доступу к недопустимым индексам в вашей матрице. - person Mike   schedule 14.05.2016