1

[私は PyQt4 を使用していますが、この Qt4 の問題は Python 固有のものではないと思います。]

私は持っていQTableWidgetます。各行の最初の列にはボタンがあります。クリックすると、行が削除されます。

行を削除するには、removeRow(int row)行のインデックスを引数として受け取るメソッドを使用します。信号を接続するとき、その間に変更される可能性があるため、行のインデックスを知ることができません (たとえば、最初の行が削除されると、すべての行のインデックスが変更されます)。

ここで受け入れられた回答は、コールバックに行内の QTableWidgetItem のインスタンスを渡し、削除時にこのアイテムから行番号を取得することを提案しています。

行の要素がQTableWidgetItem. 要素は、ボタン自体といくつかの ComboBoxes です。

これを回避する方法がわかりません。

私の要素の 1 つを QTableWidgetItem に収めることはできますか? ある種の隠し列に QTableWidgetItem を追加する必要がありますか?

現在の実装ではindexAt(QtGui.qApp.focusWidget())(上記の質問に対する他の回答を参照) を使用していますが、これは残念な回避策のように見えます。

ボタンをこのようなチェック可能な QTableWidgetItem に置き換えると

rm_item = QtGui.QTableWidgetItem()
rm_item.setFlags(QtCore.Qt.ItemIsUserCheckable |
                 QtCore.Qt.ItemIsEnabled)

行インデックスに戻るために使用できる QTableWidgetItem があります。しかし、ボタンのように「チェック」または「クリック」イベントをキャッチする方法がわかりません。私が見つけたのは のitemClicked信号QTableWidgetだけですが、他のすべてのウィジェットを除外する必要があります。

私が見逃している明らかな何かがなければなりません。

編集

ここで読んだことから、setItem を使用した QTableWidgetItem と setCellWidget を使用した Button ウィジェットの両方を同じセルに追加できました。これは私にはあまり自然なことではないように思えますが、どうやら機能しているようです (今はテストできません)。

私はそうするだろうと思います。ボタンを追加し、同じセルにダミーの QTableWidgetItem を追加して、行への参照として渡します。

これが意図された方法ですか?

編集 2

またはQTableWidget、適切なウィジェットではない可能性があります。ここでLayout提案されているように、を使用する必要があります。

4

2 に答える 2

0

あなたの質問を正しく理解している場合:

def set_button(self, row, col):
    # create a push button 
    btn = QtGui.QPushButton('Remove row')
    # connect to action
    btn.clicked.connect(self.remove_row)
    # set in cell 
    self.setCellWidget(row, col, btn)


def remove_row(self):
    # find what is clicked 
    clicked = QtGui.qApp.focusWidget()
    # position 
    idx = self.indexAt(clicked.pos())
    # remove this row
    self.removeRow(idx.row())
于 2015-04-14T18:50:05.453 に答える