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

时间:2016-10-22 21:41:00

标签: qt loops model alignment tableview

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

主要代码如下:

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

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

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

1 个答案:

答案 0 :(得分:4)

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

引用文档:

http://doc.qt.io/qt-5/qidentityproxymodel.html

  

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,但我觉得这个问题有点过分,更适合于以比设置文本对齐更深刻的方式修改视图/委托外观的任务。

有关详细信息,请参阅Set color to a QTableView row