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