Sijith
Sijith

Reputation: 3932

Create Row dynamically in QListWidget

Hi,

I want to create a custome widget. Please help by giving some idea.
My intention is to make a Listwidget which shows some Information and when clicking particulat row it have to show the details coresponding to that row by creating a new area(Row or text edit) immediately below the selected row and pull the other rows below the selected row to down after the created new area.
In attachment when I click row Nancy (consider it as row) her details is coming below the selected row. Please help on this

enter image description here

Upvotes: 1

Views: 2055

Answers (2)

Caleb Huitt - cjhuitt
Caleb Huitt - cjhuitt

Reputation: 14941

You may want to try using a custom delegate to view the rows. I believe the delegates know if they are selected. Using this, you would draw the unselected rows normally, and draw more information for the selected rows. The problem with this is that I don't know if you can resize the widget on selection. If not, the QTreeView solution should still work.

Upvotes: 1

storm_to
storm_to

Reputation: 1575

What you want to use is the QTreeView. It is capable of showing rows with text and icons. You need to define the QStandardItemModel for the table, this will give it column definition.

Below are three relevant functions from a class I wrote for a similar app. Note that I did not need to use any images in my rows so you'll have to figure that part out yourself.

def drawPeopleListBox(self):
    header = ["Picture","First Name","Last Name","Title","Address", "City", "Region"]
    self.model = QStandardItemModel(0, len(header), self)
    for i in range(len(header):
        self.model.setHeaderData(i, Qt.Horizontal, self.selectionDict[i+1].upper())

    self.itemList = QTreeView()
    self.itemList.setRootIsDecorated(False)
    self.itemList.setAlternatingRowColors(True)
    self.itemList.setSortingEnabled(False)
    self.itemList.setModel(self.model)
    self.itemList.NoEditTriggers=True

    #self.itemList.clicked[QModelIndex].connect(self.onRowClick)
    self.itemList.clicked.connect(self.onRowClick)
    self.itemList.setCursor(Qt.PointingHandCursor)

    self.itemList.setColumnWidth(0,70)
    self.itemList.setColumnWidth(1,140)
    self.itemList.setColumnWidth(2,70)
    self.itemList.setColumnWidth(3,180)
    self.itemList.setColumnWidth(4,100)
    self.itemList.setColumnWidth(5,100)
    self.itemList.setColumnWidth(6,100)

    self.populateList(self.userDataList)

def populateList(self, userDataList):
        row=[]
        for user in userDataList:
            for attrib in user:
                row.append(QStandardItem(attrib))

            for item in row:
                item.setEditable(False)

            self.model.appendRow(row)

def onRowClick(self, index):
    print index.row()
    '''
    Here you need to resize the clicked row height. Also resise the image.
    Or insert another row that matches your design requirement. 
    self.model.insertRow(rowNumber, listOfQStandardItems)
    '''         
    self.repaint()

Upvotes: 3

Related Questions