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

时间:2018-06-10 06:54:55

标签: qt qtableview qsqlquerymodel

我的项目中有三个.cpp文件:
enter image description here

现在,我重新简化了QSqlQueryModel以使其可编辑,这意味着我重新实现了函数QSqlQueryModel :: setData()和函数QSqlQueryModel :: flags(),并使用QTableview来显示数据。
在重新实现的函数QSqlQueryModel :: setData()的最后,有一个刷新步骤将数据再次填充到模型中:

rect = cv2.minAreaRect(c)
box = cv2.boxPoints(rect)
box = np.int0(box)
cv2.drawContours(paper, [box], 0, (0, 255, 0),1)

但是我使用mainwindow.cpp中的以下代码修饰了tableView(可以引用ui-> tableView):

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 ++的经验有限,我无法有效地处理它。我在网上搜索了很长时间。但没用。请帮助或尝试提供一些如何实现这一点的想法。谢谢!

1 个答案:

答案 0 :(得分:0)

MVC模式(或Qt术语Model/View Programming)的想法是将模型与视图控制器分开。 Sloppy说:&#34;模型应该只处理数据本身,不知道它将如何显示。&#34;但我绝对建议你抛出上面的链接。

您的问题的可能解决方案是在您的ScoreModel::refresh()方法中,在您定义的视图控制器(在您的情况下为mainwindow.cpp)中发出信号,然后连接相应的插槽方法以刷新您的tableview ,参见signals & slots