如何在Abstract Table Model中实现字体设置
AbstractTableModel字体设置解决方案
*QAbstractTableModel属于MVC架构中的模型层,本身仅负责数据的存储、读取与更新通知,不直接控制视图渲染属性,但可以通过返回Qt::FontRole数据的方式在模型层指定单元格字体,具体实现方案如下:
方法1:在AbstractTableModel中直接配置字体
重写自定义AbstractTableModel子类的data()函数,当入参role为Qt::FontRole时返回你指定的字体对象即可,可针对全局或指定行/列设置差异化字体:
QVariant CustomTableModel::data(const QModelIndex &index, int role) const { if (!index.isValid() || index.row() >= rowCount() || index.column() >= columnCount()) return QVariant(); // 原有其他role的处理逻辑,比如Qt::DisplayRole返回单元格展示文本 if (role == Qt::FontRole) { QFont cellFont; cellFont.setPointSize(10); // 按需设置符合行高适配的字号 // 可单独给指定行/列设置特殊字体,比如第二列加粗: // if (index.column() == 1) cellFont.setBold(true); return cellFont; } return QVariant(); }
方法2:通过TableView全局设置统一字体
如果所有单元格使用同一种字体,直接给关联的QTableView设置全局字体更简便:
QTableView *tableView = new QTableView; QFont globalFont = tableView->font(); globalFont.setPointSize(9); tableView->setFont(globalFont); // 开启行高自动适配内容 tableView->verticalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
方法3:通过自定义委托实现复杂字体控制
如果需要更精细的渲染规则,可继承QStyledItemDelegate重写paint方法,在单元格渲染阶段指定字体,同时可重写sizeHint方法返回适配字体高度的尺寸,从根源避免内容溢出。
行高适配补充
设置字体后如果仍存在内容超出行高的问题,可调用以下代码触发自动适配:tableView->resizeRowsToContents();
也可以手动固定行高:tableView->setRowHeight(目标行索引, 固定高度值);
内容的提问来源于stack exchange,提问作者Vince Viloria
相关产品推荐
相关产品推荐

