我已从数据库创建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
循环来设置所有数据。还有其他选择吗?谢谢。
答案 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。