在其他文件中(mainwindow.cpp除外),如何对ui组件进行操作?
In other files(except mainwindow.cpp),how to opertate on ui components?
我的项目中有3个.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("数据插入时间"));
}
但是我在mainwindow.cpp中用下面的代码装饰了tableView(其中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++ 的有限经验,我无法有效地处理它。我在网上找了很久。但是没有用。请帮助或尝试给出一些想法如何实现 this.Thanks!
MVC 模式(或 Qt 术语 Model/View Programming)的想法是让您的模型与视图控制器分离。马虎说:"The model should only handle the data itself and has no idea how it will be displayed." 但我绝对建议你去扔上面 link.
您的问题的可能解决方案是在您的 ScoreModel::refresh()
方法中发出一个信号,在您的视图控制器(在您的情况下为 mainwindow.cpp
)中定义并连接,然后相应的插槽方法进行刷新你的 tableview,cf。 signals & slots.
我的项目中有3个.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("数据插入时间"));
}
但是我在mainwindow.cpp中用下面的代码装饰了tableView(其中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++ 的有限经验,我无法有效地处理它。我在网上找了很久。但是没有用。请帮助或尝试给出一些想法如何实现 this.Thanks!
MVC 模式(或 Qt 术语 Model/View Programming)的想法是让您的模型与视图控制器分离。马虎说:"The model should only handle the data itself and has no idea how it will be displayed." 但我绝对建议你去扔上面 link.
您的问题的可能解决方案是在您的 ScoreModel::refresh()
方法中发出一个信号,在您的视图控制器(在您的情况下为 mainwindow.cpp
)中定义并连接,然后相应的插槽方法进行刷新你的 tableview,cf。 signals & slots.