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