QTableView с колонкой изображений - PullRequest
4 голосов
/ 24 июня 2011

У меня есть QTableView для отображения некоторых данных базы данных в виде сетки. Одним из полей является путь к изображению, и я хотел бы отобразить эти изображения в своей таблице.

Я пытался что-то с делегатом, но мне не очень-то удобно с ним, и я не мог заставить его работать Я тоже что-то пробовал с ролью:

    if index.column() == 4:
        if role == QtCore.Qt.DecorationRole:
            label = QtGui.QLabel()
            path = "path/to/my/picture.jpg"
            image = QtGui.QImage(str(path)) 
            pixmap = QtGui.QPixmap.fromImage(image)
            label.setPixmap(pixmap)
            return label

Этот кусок кода вдохновлен тем, что я нашел на другом форуме, и это должно было сработать. Однако это ничего не делает для меня, только замедляет выполнение моего кода.

Есть идеи, почему это не работает? Если у вас есть пример с делегатом, я бы тоже его оценил!

Спасибо за внимание

ПОСТАНОВИЛИ: Я получил это, работая с пользовательским делегатом. Вот мой код, если кому-то интересно:

class ImageDelegate(QtGui.QStyledItemDelegate):

    def __init__(self, parent):
        QtGui.QStyledItemDelegate.__init__(self, parent)

    def paint(self, painter, option, index):        

        painter.fillRect(option.rect, QtGui.QColor(191,222,185))

        # path = "path\to\my\image.jpg"
        path = "araignee_de_mer.jpg"

        image = QtGui.QImage(str(path))
        pixmap = QtGui.QPixmap.fromImage(image)
        pixmap.scaled(50, 40, QtCore.Qt.KeepAspectRatio)
        painter.drawPixmap(option.rect, pixmap) 

Ответы [ 3 ]

2 голосов
/ 09 декабря 2011

Спасибо за решение и пример кода, Johanna.Это была огромная помощь.

Кроме того, на случай, если кому-то еще это понадобится, изложите, как я:

1) Установите делегат элемента для столбца с изображением вашего QTableView (ясделал это в myTableView.init ()) следующим образом:

self.setItemDelegateForColumn(1, yourImageDelegate(parent))

2) В классе yourImageDelegate вы можете перегрузить sizeHint () для размера вашего изображения, например:

def sizeHint(self, option, index) :
    return QSize(160, 90) # whatever your dimensions are

Swoot!

1 голос
/ 02 сентября 2014

когда я тестирую, я использую drawPixmap (option.rect.x (), option.rect.y (), pixmap) для рисования значка, ни один не делает pixmap.scaled.

class ImageDelegate(QtGui.QStyledItemDelegate):
    def __init__(self, parent=None):
        QtGui.QStyledItemDelegate.__init__(self, parent)
        #self.icon =icon
    def paint(self, painter, option, index):
        #painter.fillRect(option.rect, QtGui.QColor(191,222,185))
        # path = "path\to\my\image.jpg"
        path = "icon1.png"
        image = QtGui.QImage(str(path))
        pixmap = QtGui.QPixmap.fromImage(image)
        #pixmap.scaled(16, 16, QtCore.Qt.KeepAspectRatio)
        # when i test ,just use option.rect.x(), option.rect.y(), no need scaled 
        painter.drawPixmap(option.rect.x(), option.rect.y(),  pixmap)
0 голосов
/ 24 июня 2011

Я не думаю, что вам нужно инкапсулировать Pixmap в метку или изображение.Попробуйте просто вернуть Pixmap.

if index.column() == 4:
    if role == QtCore.Qt.DecorationRole:            
        path = "path/to/my/picture.jpg"
        pixmap = QtGui.QPixmap(path) 
        return pixmap
...