QTableView add row background-iamge

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值