我試圖放在一起顯示我的模型的數據的簡單表。我需要行選擇行爲,所以我設置:QTableView - 使用行選擇錯誤重繪
self.setSelectionBehavior(QAbstractItemView.SelectRows)
,直到我實現selectionChanged()
這會導致重繪變得有點糊塗每一個行選擇的時間一切都很好(細胞的不要」似乎來更新他們的選擇狀態)。下面是一些引起該問題對我的測試代碼:
import sys
from PySide.QtGui import *
from PySide.QtCore import *
class Item(QStandardItem):
def __init__(self, parent=None):
super(Item, self).__init__(parent)
self.pixmap = QPixmap("colour.png")
#def data(self, role=Qt.UserRole + 1):
#'''with this method in place the cells get a checkbox and are not selectable'''
#return 'test'
class Model (QStandardItemModel):
def __init__(self, parent=None):
super(Model, self).__init__(parent)
self.setHorizontalHeaderLabels(['a', 'b', 'c'])
self.init_data()
def init_data(self):
for row in range(0, 15):
for col in range(0, 10):
col_item = Item('%s, %s' % (row, col))
self.setItem(row, col, col_item)
class TableView(QTableView):
def __init__(self, parent=None):
super(TableView, self).__init__(parent)
model = Model()
self.setModel(model)
self.setSelectionBehavior(QAbstractItemView.SelectRows)
self.setSelectionMode(QAbstractItemView.ContiguousSelection)
self.setMouseTracking(True)
def selectionChanged(self, selected, deselected):
print selected
if __name__ == '__main__':
app = QApplication([])
table = TableView()
table.show()
sys.exit(app.exec_())
我也有點困惑,爲什麼細胞的所有得到一個複選框,併成爲無法選擇,如果data()
方法在QStandardItem
實現。有人可以幫忙嗎?
乾杯, 坦率
謝謝。我不知道'selectionModel'。這應該解決這個問題。我知道子類不是必需的。他們只是我實際使用的結構的簡化版本(並且使用「測試」再次僅僅是一個簡化的例子,以顯示造成我的困惑的原因 - 我認爲這很明顯)。雖然我對模型/視圖編程相當陌生,但我已經閱讀了它並找不到針對這個特定問題的答案。我會再讀一遍。 –
@FrankRueter:查看一個項目的[可能的角色](http://doc.qt.nokia.com/4.7-snapshot/qt.html#ItemDataRole-enum)。這包括一個'CheckStateRole'。爲這個角色返回一個「字符串」是無效的。視圖解釋這一點,它可以,結果是:「嘿,這個項目有一個未經檢查的複選框」。類似於其他角色。很可能有幾個沒有記錄的內部角色,返回一個'string'會做不可預知的事情。最後,你會得到一種_broken_模型。 – Avaris
我明白了,謝謝。我認爲使用字符串是最簡單的情況。將做更多的閱讀,以使其正確。我基本上需要所有單元格中的字符串來表示項目並通過選定的行返回完整的數據(每行表示具有我需要處理的各種屬性的數據對象)。謝謝你的幫助! –