2016-01-21 6 views
0

У меня есть QListwidget. Я добавляю пользовательский элемент, отображающий изображения. То, что я хочу сделать, - это щелкнуть элемент в этом виджете, распечатать выделенный текст ярлыков и получить изображение ярлыка. Но он ничего не печатает и дает ошибку: AttributeError: 'QListWidgetItem' object has no attribute 'pixmap'. Так в чем проблема ?Получение ListWidget Элемент Текст и изображение в PyQt

class MyList(QtGui.QListWidget): 
    def __init__(self): 
     QtGui.QListWidget.__init__(self) 
     directory = QtGui.QFileDialog.getOpenFileNames(self, 'Open file', 
                 'c:\\Users\\Public\\Pictures\\Sample Pictures',"Image files (*.jpg *.gif)") 
     for i in range(len(directory)): 
      images = QtGui.QImage(directory[i]) 
      pixmap = QtGui.QPixmap.fromImage(images) 
      label = QtGui.QLabel(str(i)) 
      label.setPixmap(pixmap.scaled(QtCore.QSize(150,100))) 
      item = QtGui.QListWidgetItem(label.text()) 
      item.setSizeHint(QtCore.QSize(200,110)) 
      self.addItem(item) 
      self.setItemWidget(item,label) 
     self.setIconSize(QtCore.QSize(150,100)) 
     self.setSelectionMode(1)   # 1 = SingleSelection, 2 = MultiSelection, not necessary, default mode is singleSelection 
     self.setGeometry(200,200,300,500) 

     self.currentItemChanged.connect(self.findSel) 

    def findSel(self, current, previous): 
     print(current.text()) 
     self.labelBigImageDisplay(current.pixmap()) 

ответ

1

Поскольку QLabel не поддерживает текст и изображения то же время вы, возможно, потребуется рассмотреть вопрос о реализации собственного виджета или вам может понадобиться использовать что-то вроде QPushButton и т.д .. И ответ на ваш первоначальный вопрос вы должны спросить itemWidget, чтобы получить данные.

def findSel(self, current): 
    currentItem = self.itemWidget(current) 
    pixmap = currentItem.pixmap() 
    print pixmap 

Реализация пользовательских виджетов

Это минимальный пример из кода

mport sys 
from PyQt4 import QtCore, QtGui 

class MyCustomWid(QtGui.QWidget): 
    def __init__(self, label, imagePath, parent=None): 
     super(MyCustomWid, self).__init__(parent) 
     horizontalLayout = QtGui.QHBoxLayout() 
     self.imagePath = imagePath 
     self.captLbl = label 
     self.captLbl = QtGui.QLabel(self.captLbl) 
     horizontalLayout.addWidget(self.captLbl) 
     self.imageLbl = QtGui.QLabel() 
     pixmap = QtGui.QPixmap.fromImage(QtGui.QImage(self.imagePath)) 
     self.imageLbl.setPixmap(pixmap.scaled(QtCore.QSize(150,100))) 
     horizontalLayout.addWidget(self.imageLbl) 
     self.setLayout(horizontalLayout) 

    def getPixmap(self): 
     return self.imageLbl.pixmap() 

    def getImagePath(self): 
     return self.imagePath 

    def getText(self): 
     return self.captLbl.text() 

class MyList(QtGui.QListWidget): 
    def __init__(self): 
     QtGui.QListWidget.__init__(self) 
     imagePath = "/usr/bla/some/foo.png" 
     label = MyCustomWid("Blaa", imagePath) 
     item = QtGui.QListWidgetItem() 
     item.setSizeHint(QtCore.QSize(200,110)) 
     self.addItem(item) 
     self.setItemWidget(item,label) 
     self.setIconSize(QtCore.QSize(150,100)) 
     self.setSelectionMode(1)   # 1 = SingleSelection, 2 = MultiSelection, not necessary, default mode is singleSelection 
     self.setGeometry(200,200,300,500) 
     self.itemClicked.connect(self.findSel) 

    def findSel(self, current): 
     currentItem = self.itemWidget(current) 
     pixmap = currentItem.getPixmap() 
     imagePath = currentItem.getImagePath() 
     lblTxt = currentItem.getText() 
     print pixmap, imagePath, lblTxt 
     # self.labelBigImageDisplay(current.pixmap()) 

class MyWindow(QtGui.QDialog): 
    def __init__(self): 
     super(MyWindow, self).__init__() 
     layout = QtGui.QVBoxLayout() 
     textLbl = MyList() 
     layout.addWidget(textLbl) 
     self.setLayout(layout) 

if __name__ == '__main__': 
    app=QtGui.QApplication(sys.argv) 
    new=MyWindow() 
    new.show() 
    app.exec_()