Я пытаюсь показать изображения в QTableView в одном конкретном столбце.Для этого я создал QAbstractTableModel
.В методе data
QAbstractTableModel
я возвращаю несколько строк для столбцов с индексами 0,1,2,3 и для столбца (4), я хочу вернуть изображение.Итак, я создал QStyledItemDelegat
и переопределил его paint
метод drawPixmap в соответствии со значением state
, полученным из index.model()
.Тем не менее, это изображение не отображается, просто пустым.Изображение создается в конструкторе следующим образом:
onPixmap=QPixmap(":/on.png");
offPixmap=QPixmap(":/off.png");
//Is there something wrong about My ImagePath
MyModel
QVariant MyModel::data(const QModelIndex &index, int role) const
{
if(!index.isValid()) return QVariant();
if(role == Qt::DisplayRole) {
if (index.column() == 4) {
return sensor[row].state; //equals 0 or 1
}
}
return QVariant()
}
MyDelegate
StylePainter::StylePainter(QObject *parent)
:QStyledItemDelegate(parent)
{
onPixmap=QPixmap(":on.png");
offPixmap=QPixmap(":off.png");
}
void StylePainter::paint(QPainter *painter, const QStyleOptionViewItem
&option,const QModelIndex &index) const
{
//Pixmap couldn't display
if (index.column() == 4) {
const QAbstractItemModel *itemModel=index.model();
int state = itemModel->data(index, Qt::DisplayRole).toInt();
const QPixmap &star=state?onPixmap:offPixmap;
int width=star.width();
int height=star.height();
QRect rect=option.rect;
int x=rect.x()+rect.width()/2-width/2;
int y=rect.y()+rect.height()/2-height/2;
painter->drawPixmap(x,y,star);
}
//ProcessBar Display normally
else if (index.column() == 5)
{
const QAbstractItemModel *itemModel = index.model();
int finishedSubTaskNum = itemModel->data(index, Qt::DisplayRole).toInt();
int subTaskNum = itemModel->data(itemModel->index(index.row(),6), Qt::DisplayRole).toInt();
QString ptimer = itemModel->data(itemModel->index(index.row(),7), Qt::DisplayRole).toString();
QStyleOptionProgressBarV2 *progressBarOption = new QStyleOptionProgressBarV2();
progressBarOption->rect = option.rect;
progressBarOption->minimum = 0;
progressBarOption->maximum = subTaskNum;
progressBarOption->progress = finishedSubTaskNum;
int t = finishedSubTaskNum/subTaskNum;
//progressBarOption->text = QString::number(t) + "%";
progressBarOption->text = ptimer;
progressBarOption->textVisible = false;
QApplication::style()->drawControl(QStyle::CE_ProgressBar, progressBarOption, painter);
}
else {
QStyledItemDelegate::paint(painter, option, index);
}
Asвидите, ProcessBar хорошо отображается, а это значит, что mydelegate может нормально работать каким-то образом.Я посмотрел здесь: Показать изображение в столбце QTableView из QSqlTableModel
Но это все равно не сработало.И я не знаю, что делать дальше.Любая помощь или предложение будут полезны.