2014-07-09 121 views
3

有沒有辦法在鼠標指針下獲取行號?我想在不知道行號的情況下刪除一行,但僅使用光標位置。如何獲取QTableWidget光標下的行

編輯:

enter image description here

在此圖片您可以在資源庫中添加項目。 單擊Delete Bin時,應刪除該行。最好的方法是在點擊bin時查詢鼠標指針下的行號。行號被解析爲removeRow函數。 我不知道如何利用QPointer。並且cellEntered需要在添加或刪除新行時不會保持不變的行/列值。

回答

4

有許多方法,可以解決這個問題。有些可能涉及光標位置,其他可能會涉及到表格事件和信號。使用QCursor解決此問題的一個問題是,如果某人用鍵盤觸發按鈕而不是鼠標點擊,這意味着光標位置可能不會反映正確的行。

既然你已經在使用高層次QTableWidget,那麼這裏是一個非常簡單的方法來做到這一點:

from functools import partial 

class Table(QtGui.QWidget): 

    def __init__(self): 
     super(Table, self).__init__() 

     self.table = QtGui.QTableWidget(3, 2, self) 

     for row in xrange(3): 
      item = QtGui.QTableWidgetItem("Item %d" % row) 
      self.table.setItem(row, 0, item) 

      button = QtGui.QPushButton("X", self.table) 
      self.table.setCellWidget(row, 1, button) 

      button.clicked.connect(partial(self._buttonItemClicked, item)) 

     layout = QtGui.QHBoxLayout(self) 
     layout.addWidget(self.table) 

    def _buttonItemClicked(self, item): 
     print "Button clicked at row", item.row() 

在這個例子中,我們只是烤的第一列的項目進入點擊回調,所以當你點擊它們時,他們有一個詢問行號的參考。對於較低級別的模型/視圖,這種方法會有所不同。

+0

謝謝。如果[你在該行中沒有任何QTableWidgetItem](http://stackoverflow.com/questions/29633311/get-the-index-of-a-qtablewidget-row-knowing-its-elements)? –

+0

@Jérôme,看起來你已經通過編輯得到了你的答案......以確保你添加了一個可以跟蹤該行的「QTableWidgetItem」。 – jdi

+0

我也使用QtCore.QPersistentModelIndex得到了更好的答案。 –

3

可能您需要的是使用信號cellEntered和插槽removeRow(如果您使用的是QTableWidget)。有關PySidehere的文檔,請參閱文檔here,關於PyQt。您可能還需要在Qt文檔here中查找此主題。

1

假設去除應該發生,例如,用鼠標點擊,所有觀點都有了indexAt方法, 將任何光標/鼠標位置映射到一個模型索引:

modelIndex = myView.indexAt(cursorLocation) # where cursorLocation is a QPoint instance 

就這樣,這是直接的修改模型。

另外,類似於多魯的回答,觀點也實現了entered信號等,在一定modelindex通知您的鼠標操作:

http://qt-project.org/doc/qt-4.8/qabstractitemview.html#signals