В других файлах (кроме mainwindow.cpp), как работать с компонентами пользовательского интерфейса?
Теперь я переопределил QSqlQueryModel, чтобы сделать его редактируемым. Это означает, что я переопределил функцию QSqlQueryModel::setData() и функцию QSqlQueryModel::flags (), и я использую QTableview для отображения данных.
В конце переопределенной функции QSqlQueryModel::setData() есть шаг обновления для повторного заполнения данных в модели:
bool ScoreModel::setData(const QModelIndex &index, const QVariant &value, int /* role */)
{
if (index.column() == 0 || index.column() == 11)
return false;
QModelIndex primaryKeyIndex = QSqlQueryModel::index(index.row(), 0);
int id = data(primaryKeyIndex).toInt();
qDebug()<<"id:"<<id;
clear();
bool ok;
switch(index.column()){
case 1:
ok = setYear(id,value.toString());
break;
case 2:
ok = setStudentName(id,value.toString());
break;
...
case 10:
ok = setTeacherRemark(id,value.toString());
break;
default:
ok = false;
}
refresh();// <---
return ok;
}
void ScoreModel::refresh()
{
qDebug()<<"sqlToQueryScore in refresh:"<<MainWindow::sqlToQueryScore;
setQuery(MainWindow::sqlToQueryScore);
setHeaderData(0, Qt::Horizontal, tr("序号"));
setHeaderData(1, Qt::Horizontal, tr("年份"));
...
setHeaderData(11, Qt::Horizontal, tr("数据插入时间"));
}
но я украсил tableView следующим кодом в mainwindow.cpp(где можно ссылаться на ui->tableView):
ui->tableView->setModel(scoreModel);
//ui->tableView->setEditTriggers(QAbstractItemView::DoubleClicked);
ui->tableView->verticalHeader()->hide();
ui->tableView->resizeColumnsToContents();
ui->tableView->resizeRowsToContents();
//ui->tableView->setSelectionMode(QAbstractItemView::SingleSelection);
ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
ui->tableView->horizontalHeader()->setStretchLastSection(true);
Чтобы сохранить согласованность внешнего вида tableView, я также хочу выполнить такие операции на этапе обновления.
Из-за моего ограниченного опыта работы с Qt/C++ я не могу эффективно с этим справиться. Я давно ищу в сети. Но бесполезно. Пожалуйста, помогите или попробуйте дать некоторые идеи, как этого добиться. Спасибо!
1 ответ
Идея шаблона MVC (или в терминах Qt Программирование модель / представление) состоит в том, чтобы отделить вашу модель от контроллера представления. Слоппи сказал: "Модель должна обрабатывать только сами данные и не знает, как они будут отображаться". но я определенно советую вам сходить скинуть вышеуказанную ссылку.
Возможное решение вашего вопроса - испустить сигнал ScoreModel::refresh()
метод, по вашему мнению, контроллер (в вашем случае mainwindow.cpp
) Вы определяете и подключаете затем соответствующий метод слота, чтобы обновить вид таблицы, ср. сигналы и слоты.