的方法是使用QItemDelegate来自定义单元格的显示方式。具体步骤如下:
class ProgressBarDelegate : public QStyledItemDelegate
{
public:
ProgressBarDelegate(QObject* parent = nullptr)
: QStyledItemDelegate(parent)
{
}
void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const override
{
if (index.data().isValid() && index.column() == targetColumn) {
int progress = index.data().toInt();
QStyleOptionProgressBar progressBarOption;
progressBarOption.rect = option.rect;
progressBarOption.minimum = 0;
progressBarOption.maximum = 100;
progressBarOption.progress = progress;
progressBarOption.text = QString("%1%").arg(progress);
progressBarOption.textVisible = true;
progressBarOption.textAlignment = Qt::AlignCenter;
QApplication::style()->drawControl(QStyle::CE_ProgressBar, &progressBarOption, painter);
}
else {
QStyledItemDelegate::paint(painter, option, index);
}
}
QSize sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const override
{
if (index.data().isValid() && index.column() == targetColumn) {
return QSize(100, option.rect.height());
}
return QStyledItemDelegate::sizeHint(option, index);
}
private:
int targetColumn = 1; // 设置对应的进度条所在的列号
};
QTableView* tableView = new QTableView(this);
QStandardItemModel* model = new QStandardItemModel(this);
tableView->setModel(model);
// 设置进度条对应列的委托
ProgressBarDelegate* progressBarDelegate = new ProgressBarDelegate(this);
tableView->setItemDelegateForColumn(1, progressBarDelegate);
以上就是在QTableView行上垂直居中对齐QProgressBar的方法。使用自定义的QItemDelegate,可以根据需要灵活地定制单元格的显示效果。
领取专属 10元无门槛券
手把手带您无忧上云