В других файлах (кроме mainwindow.cpp), как работать с компонентами пользовательского интерфейса?

В моем проекте есть три файла .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++ я не могу не справиться с этим эффективно. Долго ищу в нете. Но бесполезно. Пожалуйста, помогите или попробуйте дать несколько идей, как этого добиться. Спасибо!


person chaotetung    schedule 10.06.2018    source источник


Ответы (1)


Идея шаблона MVC (или в терминах Qt Model/View Programming) заключается в том, чтобы ваша модель была отделена от вашего контроллера представления. Слоппи сказал: «Модель должна обрабатывать только сами данные и не имеет понятия, как они будут отображаться». но я определенно предлагаю вам перейти по ссылке выше.

Возможным решением вашего вопроса является подача сигнала в вашем методе ScoreModel::refresh(), в вашем контроллере представления (в вашем случае mainwindow.cpp) вы определяете и подключаете затем соответствующий метод слота для обновления вашего табличного представления, ср. сигналы и слоты.

person cuda12    schedule 11.06.2018