我扩展了一个QStyledItemDelegate
来在QTreeView的右侧绘制一些像素图。这很好用,但是,我意识到如果它太长,pixmaps可以在文本的前面。
所以我尝试在绘制像素图之前绘制一个与背景颜色相同的矩形。
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.state
和opt.features
的值以自己挑选颜色。我使用交替颜色(QStyleOptionViewItem::Alternate
)取得了一些成功,但它开始变得冗长乏味,因为还有其他状态(悬停和选定)以及其他可能具有其他状态的操作系统。必须有一个更简单的方法。
所以,我的问题是:当我使用paint
方法时,如何获得用于绘制行的实际颜色?或者,你有没有其他干净的方法来避免这种情况?
答案 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。我不知道如何获得两者的好处:普通样式和更多控件。