2011-03-16 57 views
0

我正在模型視圖編程中練習一些示例,並且詢問爲什麼顏色沒有正確表示。查詢表視圖 - 模型/視圖編程

的代碼如下:

我創建了一個表視圖

table_view = QTableView() 
table_view.show() 
table_view.setModel(model) 

test_data = data(4,5) 
model = paletteTableview(test_data) 

class paletteTableview(QAbstractTableModel): 
def __init__(self, test_data, parent=None): 
    super(paletteTableview, self).__init__(parent) 
    self.__test_data = test_data 


def rowCount(self, parent): 
    return len(self.__test_data) 

def columnCount(self, parent): 
    return len(self.__test_data[0]) 

    def data(self,index,role): 

    if role == Qt.DisplayRole: 

     row = index.row() 
     column = index.column() 
     value = self.__test_data[row][column] 
     return value 



    if role == Qt.DecorationRole: 
     row = index.row() 
     column = index.column() 

     value = self.__test_data[row][column] 
     #print value 

     value = QColor(value) 
     #print value 
     pixmap = QPixmap(26,26) 
     pixmap.fill(value) 

     icon = QIcon(pixmap) 
     return icon 


def data(row,column): 
test_data = [] 
k = "FF0000" 
temp_data= [] 
for i in range(row): 
    for j in range(column): 
     list = ['#'] 
     for a in k: 
      list.append(a) 
      d = ''.join(list) 
     temp_data.append(d) 
     c = int(k,16) 
     c = c + 1 
     k = "%X" % c 
    test_data.append(temp_data) 
    temp_data = [] 
return test_data 

我在這裏失去了一些東西?請告訴我。

回答

1

我測試你的代碼,沒有問題,但在我的顯示器上的顏色幾乎相同。我認爲你可能遇到同樣的問題,看起來所有的顏色都是紅色的,沒有任何明顯的差異。我建議使用另一種方式來生成顏色數據(通過「數據」函數返回)。
我給我的整個測試代碼,你可以運行並嘗試爲你找到一些有用的東西。 它可以使用pyqt 4.8.3.1 for python2.7在我的win7系統下運行。

import sys 
from PyQt4.QtCore import * 
from PyQt4.QtGui import * 

class paletteTableview(QAbstractTableModel): 
    def __init__(self, test_data, parent=None): 
     super(paletteTableview, self).__init__(parent) 
     self.__test_data = test_data 

    def rowCount(self, parent): 
     return len(self.__test_data) 

    def columnCount(self, parent): 
     return len(self.__test_data[0]) 

    def data(self,index,role): 
     if role == Qt.DisplayRole: 

      row = index.row() 
      column = index.column() 
      value = self.__test_data[row][column] 
      return value 


     if role == Qt.DecorationRole: 
      row = index.row() 
      column = index.column() 

      value = self.__test_data[row][column] 
      print "data:" , index.row() , index.column() , value 
      #print value 

      value = QColor(value) 
      #print value 
      pixmap = QPixmap(26,26) 
      pixmap.fill(value) 

      icon = QIcon(pixmap) 
      return icon 


class MainWindow(QMainWindow): 
    def __init__(self , parent = None): 
     super(MainWindow , self).__init__(parent) 

     self.tv = QTableView(self) 
     self.dm = paletteTableview(data(4 , 5)) 
     self.tv.setModel(self.dm) 
     self.setCentralWidget(self.tv) 


def data(row,column): 
    import random 

    test_data = [] 
    temp_data= [] 
    for i in range(row): 
     for j in range(column): 
      temp_data.append("#%06X" % random.randint(0 , 0xFFFFFF)) 
     test_data.append(temp_data) 
     temp_data = [] 
    return test_data 


def main(): 
    app = QApplication(sys.argv) 
    form = MainWindow() 
    form.show() 
    app.exec_() 

if __name__ == '__main__': 
    main() 
+0

感謝分享數據生成邏輯..真的很奇妙。它工作得很好。但即使現在我得到了相同的顏色,儘管現在十六進制值是完全不同的。我懷疑我使用價值來獲取顏色的方式。我真的懷疑decorole邏輯..它是否適合你? – user596922

+0

我編輯內容並給出我的整個測試代碼,您可以嘗試測試。但是除了「數據」之外,主要邏輯與您的完全一樣,我在Windows下使用PyQt 4.8.3.1 for python27。 – winterTTr