2016-10-28 14 views
0

self.tableView.setSortingEnabled(True)は、ヘッダーをクリックするとテーブルビューを並べ替えますが、間違って並べ替えます。つまり、すべての列が文字列であると考えます(たとえば、1,11,12,2,22,3などの数値をソートします)。これを修正するにはどうすればよいですか?PyQt:QTableView列(文字列と数値)を並べ替える方法

マイコード:

self.model = QtGui.QStandardItemModel() 

with open(file_name_temp, "rt") as fileInput: 
    i = 1 
    for row in csv.reader(fileInput): 
     item = QtGui.QStandardItem() 
     for field in row: 
      items = [ 
       item.setData(field, QtCore.Qt.UserRole) 
      ] 
      print(items) 
     self.model.appendRow(items) 

    tab_table_view = QtGui.QWidget() 
    self.Tab.insertTab(0, tab_table_view, self.File_Name) 
    self.tableView = QtGui.QTableView(tab_table_view) 
    self.tableView.setGeometry(QtCore.QRect(0, 0, 721, 571)) 
    self.model = QtGui.QStandardItemModel(self) 
    self.tableView.setModel(self.model) 
    colll = self.Datas.dtypes.index 
    col_names = np.array(colll) 
    col_names = np.insert(col_names, 0, self.Datas.index.name) 
    self.model.setHorizontalHeaderLabels(col_names) 
    self.tableView.hideRow(0) 
    self.model.setSortRole(QtCore.Qt.UserRole) 

アップデート1:すべてがコンソールに良いようだが、GUI画面上でそれがない

yyy 
yyy 
yyy 
yyy 
yyy 
yyy 
yyy 
yyy 
yyy 
[<PyQt4.QtGui.QStandardItem object at 0x0000000006DF3948>, <PyQt4.QtGui.QStandardItem object at 0x0000000006DF38B8>, <PyQt4.QtGui.QStandardItem object at 0x0000000006DF3828>, <PyQt4.QtGui.QStandardItem object at 0x0000000006DF3798>, <PyQt4.QtGui.QStandardItem object at 0x0000000006DF3678>, <PyQt4.QtGui.QStandardItem object at 0x0000000006DF3EE8>, <PyQt4.QtGui.QStandardItem object at 0x0000000006DF3F78>, <PyQt4.QtGui.QStandardItem object at 0x00000000095D4048>, <PyQt4.QtGui.QStandardItem object at 0x00000000095D40D8>] 

:として

if (".csv" or ".txt") in self.File_Name: 
     with open(file_name_temp, "rt") as fileInput: 
      i = 1 
      reader = csv.reader(fileInput) 
      next(reader, None) 
      for row in reader: 
       for x in range(0,Num_col+1): 
        try: 
         int(row[x]) 
         row[x]=int(row[x]) 
        except ValueError: 
         print('Not Int') 
       items = [] 
       for field in row: 
        item = QtGui.QStandardItem(field) 
        if type(field)==int: 
         print('yyy') 
         data = int(field) 
        else: 
         data = field 
        item.setData(data, QtCore.Qt.UserRole) 
        items.append(item) 
       print(items) 
       self.model.appendRow(items) 

は、出力を提供しますテーブルを表示しない?

答えて

2

あなたがモデルの項目を作成しているが、おそらくあなたは、このような何かやっている方法を示していない:valueはpythonの数値型である

item = QtGui.QStandardItem(str(value)) 

を。

item = QtGui.QStandardItem() 
item.setData(value, QtCore.Qt.DisplayRole) 

しかし、これはまた、表が自動的にあなたが望んでいないかもしれ編集細胞のためのスピンボックスを使用するようになりますのでご注意:

数値ソートを取得するには、代わりにこのような値を設定します。だから、別の解決策は次のようになります。

item = QtGui.QStandardItem(str(value)) 
item.setData(value, QtCore.Qt.UserRole) 
... 
model.setSortRole(QtCore.Qt.UserRole) 

最後に、完全にカスタマイズされたソートのために、あなたもQStandardItemをサブクラス化することができます

class StandardItem(QtGui.QStandardItem): 
    def __lt__(self, other): 
     return int(self.text()) < int(other.text()) 

item = StandardItem(str(value)) 

UPDATE

ここでは、CSVを読み込むデモスクリプトですファイルをテーブルに格納し、フィールドをソート用の正しいデータ型に自動的に変換します。

import sys, csv 
from PyQt4 import QtCore, QtGui 

class Window(QtGui.QWidget): 
    def __init__(self): 
     super(Window, self).__init__() 
     self.model = QtGui.QStandardItemModel(self) 
     self.model.setSortRole(QtCore.Qt.UserRole) 
     self.tableView = QtGui.QTableView() 
     self.tableView.setSortingEnabled(True) 
     self.tableView.setModel(self.model) 
     self.button = QtGui.QPushButton('Open CSV', self) 
     self.button.clicked.connect(self.handleButton) 
     layout = QtGui.QVBoxLayout(self) 
     layout.addWidget(self.tableView) 
     layout.addWidget(self.button) 

    def handleButton(self): 
     path = QtGui.QFileDialog.getOpenFileName(
      self, 'Open CSV', '', 'CSV files (*.csv *.txt)') 
     if path: 
      self.model.setRowCount(0) 
      with open(path) as stream: 
       reader = csv.reader(stream) 
       next(reader, None) 
       for row in reader: 
        items = [] 
        for field in row: 
         item = QtGui.QStandardItem(field) 
         for numtype in (int, float): 
          try: 
           data = numtype(field) 
           break 
          except (ValueError, OverflowError): 
           pass 
         else: 
          print('Not a number: %r' % field) 
          data = field 
         item.setData(data, QtCore.Qt.UserRole) 
         items.append(item) 
        self.model.appendRow(items) 

if __name__ == '__main__': 

    app = QtGui.QApplication(sys.argv) 
    window = Window() 
    window.setGeometry(500, 150, 600, 400) 
    window.show() 
    sys.exit(app.exec_()) 
+1

私は今アイテムの宣言方法を掲載しました。今あなたは私を助けることができますか? @VenkataNarsiReddyVaddula。 – learncode

+1

モデルには 'setSortRole'メソッドがあります。私が示した3つの異なる方法のいずれかでアイテムを作成することができます。アイテムは確かに 'setData'メソッドを持っています - あなたは何とか何か間違ったことをしているに違いありません。 – ekhumoro

+1

はい、それはありますが、QTableViewに同時に行全体を追加しているので、データを並べ替えることができません。コードを更新しました。 @VenkataNarsiReddyVaddula。 – learncode

関連する問題