Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt 在其他文件(mainwindow.cpp除外)中,如何操作ui组件?_Qt_Qtableview_Qsqlquerymodel - Fatal编程技术网

Qt 在其他文件(mainwindow.cpp除外)中,如何操作ui组件?

Qt 在其他文件(mainwindow.cpp除外)中,如何操作ui组件?,qt,qtableview,qsqlquerymodel,Qt,Qtableview,Qsqlquerymodel,我的项目中有三个.cpp文件: 现在,我重新实现了QSqlQueryModel以使其可编辑,这意味着我重新实现了函数QSqlQueryModel::setData()和函数QSqlQueryModel::flags(),并使用QTableview显示数据。 在重新实现的函数QSqlQueryModel::setData()的末尾,有一个刷新步骤,用于再次将数据填充到模型中: bool ScoreModel::setData(const QModelIndex &index, const

我的项目中有三个.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外观的一致性,我还想在刷新步骤中进行这样的操作。

在我有限的Qt/C++经验中,我不能有效地处理它。我在网上搜索了很长时间。但是没有用。请帮助或尝试给出一些如何实现这一点的想法。谢谢

MVC模式(或用Qt术语)的思想是将模型与视图控制器分开。Sloppy说:“模型应该只处理数据本身,不知道它将如何显示。”但我绝对建议你扔掉上面的链接

您的问题的可能解决方案是在视图控制器中的
ScoreModel::refresh()
方法中发出一个信号(在您的示例中是
mainwindow.cpp
),然后定义并连接相应的插槽方法以刷新tableview,cf

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);