2
votes

I have a question regarding QTableWidget at PyQt4. Say I have a QTableWidget, where I want to have an event connected to a cell click using:

table.cellClicked.connect(cellClick)

then, cellClick function does its job. The thing is: some cells contain a button, like so (coordinates 0,0 as an example):

button = QtGui.QPushButton()
table.setCellWidget(0,0, button)

Now comes my problem. The presence of the button in a cell (which takes up the entire cell space) completely disables the cellClicked - the cell doesn't get clicked, the action can't be detected. But I do want my button to fill the cell.

So, in short, my question is - how can I select (click) a QTableWidget cell when there's a button inside it?

1

1 Answers

7
votes

The simple answer would seem to be:

    button.clicked.connect(cellClick)

But then how would you know the row/column of the cell that was clicked? So the next iteration might be:

    button = QtGui.QPushButton()
    table.setCellWidget(row, column, button)
    button.clicked.connect(
        lambda *args, row=row, column=column: cellClick(row, column))

Which is okay if the table is static. But what if the rows and columns can be rearranged? The row/column cached in the button's clicked handler could be invalidated in that case. So the next iteration might be:

   index = QtCore.QPersistentModelIndex(table.model().index(row, column))
   button.clicked.connect(
        lambda *args, index=index: cellClick(index.row(), index.column()))

(NB: you can connect other slots to the button's clicked signal, but the order they will be invoked in is undefined)