QTableView add row background-iamge

本文介绍了一个使用Qt自定义QItemDelegate的示例,展示了如何根据不同列内容绘制背景图片、进度条及按钮等元素,实现丰富的界面展示效果。
TrackDelegate::TrackDelegate(QObject *parent)
: QItemDelegate(parent)

void TrackDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{

		QStyleOptionViewItem  viewOption(option);
		QString backgroundImage;
		if (viewOption.state & QStyle::State_Selected)
		{
			backgroundImage = "image2.png";
		}else{
			backgroundImage = "image.png";
		}
		if (viewOption.state & QStyle::State_Selected)
		viewOption.state = viewOption.state ^ QStyle::State_Selected;

		if (viewOption.state & QStyle::State_HasFocus)
			viewOption.state = viewOption.state ^ QStyle::State_HasFocus;
		QPixmap pixmap(backgroundImage);
		pixmap.scaled(option.rect.width(),option.rect.height());
		qDebug()<<"backgroundImage"<<backgroundImage;
		qDebug()<<option.rect.width()<<option.rect.height();
		QBrush brush(pixmap);
		painter->save();
		painter->fillRect(option.rect, brush/*QColor(238, 233, 233, 255)*/);
		painter->restore();
		viewOption.rect = QRect(option.rect.x(), option.rect.y(), option.rect.width(), option.rect.height());
	switch (index.column())
	{
	case 0:
		{
			QVariant var= index.model()->data(index,Qt::DisplayRole);
			QString strStempJpgPath = var.toString();
			QPixmap pixmap(strStempJpgPath);
			//int width=pixmap.width();
			//int height=pixmap.height();

			/*	For example, if you have code like
			pixmap.resize(size);
			you can rewrite it as
			pixmap = pixmap.copy(QRect(QPoint(0, 0), size));
			*/

			//pixmap = pixmap.copy(QRect(QPoint(10, 10), size)); //图片去掉边缘

			//将图片的宽和高都缩放,并且在给定的矩形内保持宽高的比值
			pixmap = pixmap.scaled(option.rect.width(),option.rect.height(),Qt::KeepAspectRatio);
			painter->drawPixmap(option.rect.x(),option.rect.y(),pixmap);
			break;
		}
	case 3:
		{
			int progress = index.model()->data(index,Qt::DisplayRole).toInt();
			QStyleOptionProgressBar progressBarOption;
			progressBarOption.rect = QRect(option.rect.x(), option.rect.y()+(SETHEIGHT - PROGRESSBARHEIGHT)/2, option.rect.width(), /*option.rect.height()*/PROGRESSBARHEIGHT);
			progressBarOption.state |= QStyle::State_Enabled;
			progressBarOption.direction = QApplication::layoutDirection();
			progressBarOption.fontMetrics = QApplication::fontMetrics();
			progressBarOption.minimum = 0;
			progressBarOption.maximum = 100;
			progressBarOption.textAlignment = Qt::AlignCenter;
			progressBarOption.textVisible = true;
			progressBarOption.progress = progress < 0 ? 0 : progress;
			progressBarOption.text = QString().sprintf("%d%%", progressBarOption.progress);
			QApplication::style()->drawControl(QStyle::CE_ProgressBar, &progressBarOption, painter);
			break;
		}
	case 4:
		{
			QPushButton * statusBtn;
			int status = index.model()->data(index,Qt::DisplayRole).toInt();
			QStyleOptionButton pushButtonOption;
			pushButtonOption.rect = QRect(option.rect.x(), option.rect.y()+((100 - 20)/2), 20,20);
			pushButtonOption.state |= QStyle::State_Enabled;
			pushButtonOption.direction = QApplication::layoutDirection();
			switch (status)
			{
			case DOWNLOAD_START:
				{
					pushButtonOption.state |=QStyle::State_None;
					pushButtonOption.icon = QIcon("play.png");
					statusBtn = startDownloadStatusBtn;
					break;
				}
			case DOWNLOAD_STOP:
				{
					pushButtonOption.state |=QStyle::State_None;
					pushButtonOption.icon = QIcon("pause.png");
					statusBtn = stopDownloadStatusBtn;
					break;
				}
			case DOWNLOAD_START_HOVER:
				{
					pushButtonOption.state |= QStyle::State_MouseOver;
					pushButtonOption.icon = QIcon("play_hover.png");
					statusBtn = startDownloadStatusBtn;
					break;
				}
			case DOWNLOAD_START_PRESSED:
				{
					pushButtonOption.state |= QStyle::State_Sunken;
					pushButtonOption.icon = QIcon("play_hover.png");
					statusBtn = startDownloadStatusBtn;
					break;
				}
			case DOWNLOAD_STOP_HOVER:
				{
					pushButtonOption.state |= QStyle::State_MouseOver;
					pushButtonOption.icon = QIcon("pause_hover.png");
					statusBtn = stopDownloadStatusBtn;
					break;
				}
			case DOWNLOAD_STOP_PRESSED:
				{
					pushButtonOption.state |= QStyle::State_Sunken;
					pushButtonOption.icon = QIcon("pause_hover.png");
					statusBtn = stopDownloadStatusBtn;
					break;
				}
			default:
				{
					break;
				}
			}
			pushButtonOption.iconSize = QSize(30, 30);
			QApplication::style()->drawControl(QStyle::CE_PushButton, &pushButtonOption, painter, statusBtn);
			break;
		}
	default:
		QItemDelegate::paint(painter, viewOption,index);
		break;
	}
}


<think>我们正在讨论Qt样式表(QSS)中的`selection-background-color`属性。根据引用,这个属性用于设置选中项的背景颜色。 引用[1]展示了在QTableView中设置选中行背景色的例子:`QTableView::item { selection-background-color: red; }`。 引用[2]提到,alternate-background-color用于交替背景色,但这不是我们当前关注的属性。 引用[3]展示了一个QLineEdit的样式设置,其中也使用了`selection-background-color`。 因此,我们可以总结:`selection-background-color`用于设置当项目被选中时的背景颜色。它通常用于可选中项(如QTableView、QListView、QTreeView、QListWidget、QTableWidget、QTreeWidget等)以及像QLineEdit、QTextEdit这样的文本编辑控件中被选中文本的背景。 使用方法: 1. 在QSS中,通过选择器指定要应用样式的控件。 2. 设置`selection-background-color`属性为你想要的颜色。 示例: 对于QTableView,设置选中行的背景色为红色: QTableView::item { selection-background-color: red; } 对于QLineEdit,设置选中文本的背景色为深灰色: QLineEdit { selection-background-color: darkgray; } 注意:在QTableView中,有时需要同时设置`selection-color`(选中项的前景色,即文字颜色)来确保文字清晰可见。 另外,如果设置了整个应用程序的样式,也可以使用全局选择器,例如: * { selection-background-color: blue; } 但这样会应用于所有支持该属性的控件。 问题:如何确保设置生效? 有时,如果其他样式规则覆盖了该属性,可能不会生效。另外,某些控件可能需要设置不同的子控件(如QTableView中的item)或者使用不同的伪状态(如:selected)。 因此,我们给出一个完整的示例,设置一个QTableView的选中行背景色和文字颜色: ```css QTableView::item:selected { background-color: red; /* 也可以使用selection-background-color */ color: white; /* 也可以使用selection-color */ } ``` 或者使用: ```css QTableView::item { selection-background-color: red; selection-color: white; } ``` 两种方式都可以。注意,在Qt中,`background-color`和`selection-background-color`是两个不同的属性。在选中状态下,通常`selection-background-color`会覆盖`background-color`。但是,使用伪状态`:selected`并设置`background-color`也是一种常见做法。 根据引用[1]中的例子,他们使用了`selection-background-color`,所以我们可以按照这种方式。 现在,我们来生成相关问题。</think>在 Qt 中,`selection-background-color` 是 QSS 样式表中用于设置选中项背景颜色的属性。以下是详细使用方法及注意事项: ### 基本用法 1. **设置选中区域背景色**: ```css QTableView::item { selection-background-color: red; /* 设置选中项背景为红色 */ selection-color: white; /* 设置选中项文字颜色为白色 */ } ``` 此代码会使 `QTableView` 中被选中的行显示红色背景和白色文字[^1]。 2. **通用控件设置**: ```css * { selection-background-color: #3498db; /* 设置全局选中背景色 */ } ``` 适用于所有支持选中状态的控件(如 `QListView`、`QTreeView` 等)[^3]。 ### 常见问题解决 1. **设置不生效**: - 确保控件启用了选中功能(如 `setSelectionMode()`) - 检查样式覆盖:更具体的子控件选择器优先级更高 - 添加 `!important` 强制覆盖: ```css QTableView::item:selected { background-color: red !important; } ``` 2. **隔行变色冲突**: 当使用 `setAlternatingRowColors(true)` 时[^2],需额外设置: ```css QTableView { alternate-background-color: #f0f0f0; /* 交替行背景色 */ } QTableView::item:selected { background-color: #3498db; /* 选中行背景色 */ } ``` ### 完整示例 ```css /* 全局文本控件选中样式 */ QLineEdit, QTextEdit { selection-background-color: #2ecc71; /* 选中文本背景色 */ selection-color: black; /* 选中文本颜色 */ } /* 表格控件选中行样式 */ QTableView::item:selected { background-color: #e74c3c; /* 选中行背景 */ color: white; /* 选中行文字 */ border: none; /* 移除边框 */ } ``` > ⚠️ 注意:某些控件(如 `QTableWidget`)需要同时设置 `item:selected` 和 `selection-background-color` 确保兼容性[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值