QTreeView彩绘的行

时间:2017-01-20 18:48:37

标签: qt qtreeview

我扩展了一个QStyledItemDelegate来在QTreeView的右侧绘制一些像素图。这很好用,但是,我意识到如果它太长,pixmaps可以在文本的前面。 enter image description here

所以我尝试在绘制像素图之前绘制一个与背景颜色相同的矩形。

void MyItemDelegate::paint(
    QPainter *painter,
    const QStyleOptionViewItem &option,
    const QModelIndex &index) const
{
    ...
    QStyledItemDelegate::paint(painter, option, index);
    ...
    QStyleOptionViewItem opt = option;
    initStyleOption(&opt, index);
    ...
    painter->fillRect(rect, opt.backgroundBrush);
    painter->drawPixmap(topLeft, pixmap);
}

我知道除了opt.backgroundBrush之外所有变量都是正确的。无论有没有initStyleOption电话,它总是隐形黑色。

然后我开始检查opt.stateopt.features的值以自己挑选颜色。我使用交替颜色(QStyleOptionViewItem::Alternate)取得了一些成功,但它开始变得冗长乏味,因为还有其他状态(悬停和选定)以及其他可能具有其他状态的操作系统。必须有一个更简单的方法。

所以,我的问题是:当我使用paint方法时,如何获得用于绘制行的实际颜色?或者,你有没有其他干净的方法来避免这种情况?

2 个答案:

答案 0 :(得分:0)

我可能会有不同的处理方式。我不会先致电:

QStyledItemDelegate::paint(painter, option, index);

首先。

然后,重要的部分:如果您知道项目上有多少图标,则可以计算边界矩形。

你怎么知道你有多少个图标?也许通过调用类似的东西:

bool hasIcon = index->data(YourAPP::HasIcons).toBool();

你的代表可以有类似的东西:

void MyItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const {
...
QStyleOptionViewItem o = option;
initStyleOption(&o, index);
bool hasIcon = index->data(YourModel::HasIcons).toBool();
// or
bool hasCustomRole1 = index->data(YourModel::Role1).toBool();
bool hasCustomRole2 = index->data(YourModel::Role2).toBool();

if (hasIcon) {
    // width of your icons, can be like o.rect.height() * numbers of icons
    int width = 0;

    // shrink your first rectangle
    o.rect.adjust(0, 0, -width, 0);

    // create a second rectangle
    QStyleOptionViewItem o2 = option;
    initStyleOption(&o2, index);
    o2.rect.adjust(width, 0, 0, 0);

    // paint your icons
    ...
    painter->drawPixmap(o2, pixmap);
} else {
    QStyledItemDelegate::paint(painter, option, index);
}

答案 1 :(得分:0)

如@GM建议。我使用QItemDelegate类而不是QStyledItemDelegate类,并且对绘制过程有更多控制。尤其是因为添加了drawDisplay之类的protected functions。重写此方法,我可以将“显示矩形”调整为小于Qt计算的大小。

void ActionsItemDelegate::drawDisplay(
    QPainter *painter,
    const QStyleOptionViewItem &option,
    const QRect &rect,
    const QString &text) const
{
    const int minX = ...; // x position of the left-most icon
    const int iconsWidth = rect.width() - (minX - rect.x());
    QItemDelegate::drawDisplay(painter, option, rect.adjusted(0, 0, -iconsWidth, 0), text);
}

缺点是使用QStyledItemDelegate时UI changes。我不知道如何获得两者的好处:普通样式和更多控件。