Qt 如何在不使用for循环的情况下为tableView中的所有数据设置文本对齐方式?

Qt 如何在不使用for循环的情况下为tableView中的所有数据设置文本对齐方式?,qt,loops,model,alignment,tableview,Qt,Loops,Model,Alignment,Tableview,我已经从数据库中创建了一个表视图。那么,如何在此表视图中为所有数据设置文本对齐方式?我不想使用for循环来设置tableView中的每个项目,因为这很耗时 主要代码如下: QSqlRelationalTableModel *model= new QSqlRelationalTableModel(NULL, db); model->setTable(dbName); model->select(); QTableView *tableView = new QTableView

我已经从数据库中创建了一个
表视图
。那么,如何在此
表视图中为所有数据设置文本对齐方式?我不想使用
for
循环来设置tableView中的每个项目,因为这很耗时

主要代码如下:

QSqlRelationalTableModel *model= new QSqlRelationalTableModel(NULL, db);    
model->setTable(dbName);
model->select();

QTableView *tableView = new QTableView(NULL);
tableView->setModel(model);

有些人可能建议创建
QSqlRelationalTableModel
的子类,但这也需要
for
循环来设置所有数据。还有其他选择吗?谢谢。

使用
QIdentityProxyModel
(从4.8开始,使用
QAbstractProxyModel
的想法是一样的,前者只是一个方便的类,只允许重新实现所需的方法,从而节省了您的时间)。这种方法避免了使用
for
循环,因为数据是在每个元素请求时设置和返回的。换句话说,不是迭代所有数据并设置所需的值(即命令式方法),而是修改类中向视图提供数据的方法(更多的是声明式方法),视图在必要时自行提取数据

引用文件:

QIdentityProxyModel类未修改地代理其源模型。因为它不进行排序或筛选,所以该类最适合于转换源模型的data()的代理模型。例如,可以创建代理模型来定义所使用的字体、背景颜色或工具提示等。这样就不需要在创建模型结构的同一类中实现所有数据处理,也可以用于创建可重用的组件

对于我们的情况,可能的实现如下所示:

class StylingProxyModel : public QIdentityProxyModel
{
  QVariant data(const QModelIndex &index, int role) const
  {
    if (role != Qt::TextAlignmentRole)
      return QIdentityProxyModel::data(index, role);

    return Qt::AlignCenter;
  }
};
正如您所看到的,模型将通过自身传递不匹配的部分数据
Qt::TextAlignmentRole
,否则返回所需的值

QSqlRelationalTableModel
设置为此自定义标识模型的源,并将代理模型设置为视图的源

“重炮”选项将是子类
QStyledItemDelegate
,但我觉得这对于所讨论的案例来说太过分了,它更适合于以更深刻的方式修改视图/委托外观的任务,而不仅仅是设置文本对齐


请参阅以获取进一步阅读。

使用
QIdentityProxyModel
(从4.8开始,使用
QAbstractProxyModel
的想法是相同的,前者只是一个方便的类,只允许重新实现所需的方法,从而节省了您的时间)。这种方法避免了使用
for
循环,因为数据是在每个元素请求时设置和返回的。换句话说,不是迭代所有数据并设置所需的值(即命令式方法),而是修改类中向视图提供数据的方法(更多的是声明式方法),视图在必要时自行提取数据

引用文件:

QIdentityProxyModel类未修改地代理其源模型。因为它不进行排序或筛选,所以该类最适合于转换源模型的data()的代理模型。例如,可以创建代理模型来定义所使用的字体、背景颜色或工具提示等。这样就不需要在创建模型结构的同一类中实现所有数据处理,也可以用于创建可重用的组件

对于我们的情况,可能的实现如下所示:

class StylingProxyModel : public QIdentityProxyModel
{
  QVariant data(const QModelIndex &index, int role) const
  {
    if (role != Qt::TextAlignmentRole)
      return QIdentityProxyModel::data(index, role);

    return Qt::AlignCenter;
  }
};
正如您所看到的,模型将通过自身传递不匹配的部分数据
Qt::TextAlignmentRole
,否则返回所需的值

QSqlRelationalTableModel
设置为此自定义标识模型的源,并将代理模型设置为视图的源

“重炮”选项将是子类
QStyledItemDelegate
,但我觉得这对于所讨论的案例来说太过分了,它更适合于以更深刻的方式修改视图/委托外观的任务,而不仅仅是设置文本对齐


请参阅以获取进一步阅读。

您是否测试了
QIdentityProxyModel
解决方案?我没有时间测试自己,很想知道它是否按预期工作。你检查过解决方案是否有效吗?你测试过
QIdentityProxyModel
解决方案了吗?我没有时间测试自己,我很想知道它是否按预期工作。你检查过解决方案是否有效吗?