gpt4 book ai didi

qt - 如何用QStyledItemDelegate绘制不同的背景?

转载 作者:行者123 更新时间:2023-12-02 03:37:22 32 4
gpt4 key购买 nike

问题:

  • 我有 QTreeView 对象,以及一个 QStandardItemModel 作为查看小部件的模型;
  • 对于某些项目,我使用 setData 方法设置数据,以使用参数拆分它们;
  • 所以我需要为 QStandardItem 项绘制不同背景像素图,其中包含图标和一些文本数据;
  • 并且不想想要重绘所有项目对象,我的意思是图标和文本。只需更改背景即可。

首先,我在想:

  • 我可以在 Qt Designer 中为具有 2 个不同背景图片的对象设置 CSS 样式表,但是 QStandardItem 没有 setProperty 方法...

示例:

QTreeView#treeView::item[ROLE="AAA"],
QTreeView#treeView::branch[ROLE="AAA"]
{
height: 25px;
border: none;
color: #564f5b;
background-image: url(:/backgrounds/images/row1.png);
background-position: top left;
}

QTreeView#treeView::item[ROLE="BBB"],
QTreeView#treeView::branch[ROLE="BBB"]
{
height: 25px;
border: none;
color: #564f5b;
background-image: url(:/backgrounds/images/row2.png);
background-position: top left;
}
  • 然后我创建了自己的委托(delegate),继承自 QStyledItemDelegate 类,并重新实现 paint 方法,但是我不能只更改背景,因为 QStyledItemDelegate::paint( Painter, opt, index ); 代码会 overdraw 我的 drawPixmap...

示例:

QStyleOptionViewItemV4 opt = option; // Для обхода QTBUG-4310
opt.state &= ~QStyle::State_HasFocus; // Чтобы не рисовался прямоугольник фокуса

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

// HERE I WANT TO CHANGE BACKGROUND (DEFAULT IS ALREADY SET IN DESIGNER WITH ABOVE CODE)
if( index.data( SORT_ROLE ).toBool() )
{
const QPixmap pixmap( ":/backgrounds/images/backgrounds/contractor_row__high_priority.png" );
painter->drawPixmap( option.rect, pixmap, pixmap.rect() );

QStyledItemDelegate::paint( painter, opt, index );
}

所以我被困住了......

最佳答案

这是我的技巧:

Designer 的样式表部分:

QTreeView#treeView
{
border: none;
background-color:#f0f0f1;
}

QTreeView#treeView::item,
QTreeView#treeView::branch
{
height: 25px;
border: none;
color: #564f5b;
}

QTreeView#treeView::item:selected,
QTreeView#treeView::branch:selected
{
border-bottom: none;
color: #ffffff;
background-image: url(:/backgrounds/images/backgrounds/kontragents_row_selection.png);
background-position: top left;

}

QTreeView#treeView::item:selected:!active,
QTreeView#treeView::branch:selected:!active
{
color: #ffffff;
}

委托(delegate)重新实现paint()方法:

void paint( QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index ) const
{
QStyleOptionViewItemV4 opt = option; // Для обхода QTBUG-4310
opt.state &= ~QStyle::State_HasFocus; // Чтобы не рисовался прямоугольник фокуса

QBrush brush = opt.backgroundBrush;
brush.setTexture( QPixmap( index.data( SORT_ROLE ).toBool()
? BACKGROUND_HIGH_PRIORITY
: BACKGROUND_STANDARD ) );

// FILL BACKGROUND
painter->save();
painter->fillRect( opt.rect, brush );
painter->restore();

// DRAW ICON & TEXT
QStyledItemDelegate::paint( painter, opt, index );

// IF ( CHILD ) THEN PAINT OVER ONLY! BRANCH RECT
bool isIndexParent = !index.parent().isValid();
if( !isIndexParent )
{
QRect rect( 0, opt.rect.y(), 20, opt.rect.height() );

if( opt.state & QStyle::State_Selected )
{
brush.setTexture( QPixmap( BACKGROUND_SELECTED ) );
}

painter->save();
painter->fillRect( rect, brush );
painter->restore();
}
}

生成的QTreeView View :

enter image description here

祝你有美好的一天! :)

PS:无需重绘图标、文本、选择...

关于qt - 如何用QStyledItemDelegate绘制不同的背景?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10757951/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com