2012-08-24 34 views
0

我試圖放在一起顯示我的模型的數據的簡單表。我需要行選擇行爲,所以我設置: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實現。有人可以幫忙嗎?

乾杯, 坦率

回答

0

要覆蓋QTableView小號selectionChanged。這可能(可能)在視圖內部使用,並且阻止了這一點。我不確定你爲什麼想要這樣做。如果要在選擇更改時執行自定義操作,則應該使用selectionModel()selectionChanged信號作爲視圖。

但是,如果你在首要selectionChanged堅持TableView至少致電家長也發揮作用,使視圖可以做的工作:

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 
     super(TableView, self).selectionChanged(selected, deselected) 

,你不需要,你真的不該爲了設置一些屬性,我們不需要子類QTableView。你可以爲一個實例做到這一點。其實,你所有的小班都是不必要的。你可以寫這樣的代碼:

import sys 
from PySide.QtGui import * 
from PySide.QtCore import * 

if __name__ == '__main__': 
    app = QApplication([]) 

    # create model 
    model = QStandardItemModel() 
    model.setHorizontalHeaderLabels(['a', 'b', 'c']) 

    # fill data 
    for row in range(15): 
     model.appendRow([QStandardItem('%d, %d' % (row, col)) for col in range(10)]) 

    # create table view 
    table = QTableView() 

    # set parameters 
    table.setModel(model) 
    table.setSelectionBehavior(QAbstractItemView.SelectRows) 
    table.setSelectionMode(QAbstractItemView.ContiguousSelection) 
    table.setMouseTracking(True) 

    # show 
    table.show() 

    sys.exit(app.exec_()) 

至於重寫data方法模型:data方法負責返回取決於查看詢問role許多不同的值。你總是返回"test"所有的人。也就是說,至少可以說,不好,。如果你想創建自己的模型,至少應該閱讀關於模型/視圖在Qt中的工作方式。官方文檔有關於它的a nice section。您還可以在網上找到一些體面的視頻教程。

+0

謝謝。我不知道'selectionModel'。這應該解決這個問題。我知道子類不是必需的。他們只是我實際使用的結構的簡化版本(並且使用「測試」再次僅僅是一個簡化的例子,以顯示造成我的困惑的原因 - 我認爲這很明顯)。雖然我對模型/視圖編程相當陌生,但我已經閱讀了它並找不到針對這個特定問題的答案。我會再讀一遍。 –

+0

@FrankRueter:查看一個項目的[可能的角色](http://doc.qt.nokia.com/4.7-snapshot/qt.html#ItemDataRole-enum)。這包括一個'CheckStateRole'。爲這個角色返回一個「字符串」是無效的。視圖解釋這一點,它可以,結果是:「嘿,這個項目有一個未經檢查的複選框」。類似於其他角色。很可能有幾個沒有記錄的內部角色,返回一個'string'會做不可預知的事情。最後,你會得到一種_broken_模型。 – Avaris

+0

我明白了,謝謝。我認爲使用字符串是最簡單的情況。將做更多的閱讀,以使其正確。我基本上需要所有單元格中的字符串來表示項目並通過選定的行返回完整的數據(每行表示具有我需要處理的各種屬性的數據對象)。謝謝你的幫助! –