Отобразить изображение в QTableView - PullRequest
0 голосов
/ 30 сентября 2018

Я пытаюсь показать изображения в 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

Но это все равно не сработало.И я не знаю, что делать дальше.Любая помощь или предложение будут полезны.

...