2017-05-11 4 views
1

テーブルを作成したので、1つのボタンをクリックしてテーブルを作成する必要があります。私はテーブルを作成し、私は行数を割り当てなかった。私はプログラムを実行すると、行なしのテーブルを表示します(ヘッダーラベルなどを表示します)。これまでのところすべてが問題ありません。私は行を追加するボタンを入れ、次のコードを書いた:QTableWidget:行を挿入するとアプリケーションのpythonがクラッシュする

self.tableWidget.InsertRow(self.tableWidget.rowCount()+1) 

アプリケーションは単に終了します。

私がしようとした場合:

self.tableWidget.setRowCount(count+1) 

それは行を追加します。いくつかのデータを列に入力して再度呼び出したとします。

self.tableWidget.setRowCount(count+1) 

1行のデータを削除します。

私の質問は:

たちはsetRowCountを設定せずにinsertRowを使用することはできますか?

私はsetRowCountを複数回呼び出すと、なぜUIで行に埋め込まれたデータが削除されますか?

+0

'setRowCount'は' count'で呼び出されます。それは毎回同じ値ですか? –

+0

'insertRow'は小文字の' i'であるべきです。 –

+0

@DavidChingコメントありがとうございます。カウントはすべてのコールごとに増分しています。プログラムを実行すると、行が追加されます。 3行が作成され、ユーザーが行にデータを入力したとします。ユーザーはもう1行とデータを追加します。 setRowCountが呼び出されると空白の行が1つ追加されますが、既存の行のデータは削除されます。 – Manish

答えて

0

私はあなたが求めているものを正確に表示するために簡単なものを実装することができますが、必要なものに似たものを実装しました。テーブルからデータを取得してQLineChartに記入する必要がありました。

要約すると、QAbstractItemModelが必要とするすべての必要なメソッドをオーバーライドする必要があります。

import random 

from PyQt5.QtCore import QAbstractItemModel 
from PyQt5.QtCore import QModelIndex 
from PyQt5.QtCore import QRect 
from PyQt5.QtCore import QVariant 
from PyQt5.QtCore import Qt 
from PyQt5.QtCore import pyqtSignal 
from PyQt5.QtGui import QColor 


class ItemModelLineChart(QAbstractItemModel): 

    signal_update_models = pyqtSignal() 

    def __init__(self): 
     super(ItemModelLineChart, self).__init__() 
     self.m_column_count = 2 
     self.m_row_count = 0 
     self.m_mapping = {} 
     self.m_data = [] 
     # self.fill_with_random_data() 

    def fill_with_random_data(self): 
     print(self.m_row_count) 
     for r in range(self.m_row_count): 
      data_vec = [None] * self.m_column_count 
      for c in range(len(data_vec)): 
       if (c%2)==0: 
        data_vec[c] = r*50+random.randint(0,100)%20 
       else: 
        data_vec[c] = random.randint(0, 100) % 20 
      self.m_data.append(data_vec) 

    def rowCount(self, parent=None, *args, **kwargs): 
     return len(self.m_data) 

    def columnCount(self, parent=None, *args, **kwargs): 
     return self.m_column_count 

    def headerData(self, section, orientation, role=None): 
     if role == Qt.DisplayRole: 
      return QVariant() 
     if orientation == Qt.Horizontal: 
      if section%2==0: 
       return "x" 
      else: 
       return "y" 
     else: 
      return "{}".format(section+1) 

    def data(self, index, role=None): 
     if role == Qt.DisplayRole: 
      return self.m_data[index.row()][index.column()] 
     elif role == Qt.EditRole: 
      return self.m_data[index.row()][index.column()] 
     elif role == Qt.BackgroundRole: 
      for color, rect in self.m_mapping.items(): 
       if rect.contains(index.column(), index.row()): 
        return QColor(color) 
     return QVariant() 

    def setData(self, index, value, role=None): 
     if index.isValid() and role == Qt.EditRole: 
      self.m_data[index.row()][index.column()] = int(value) 
      self.dataChanged.emit(index,index) 
      self.signal_update_models.emit() 
      return True 
     return False 

    def get_data(self, index): 
     return self.m_data[index.row()][index.column()] 

    def add_mapping(self, color, area): 
     self.color = color 
     self.area = area 
     self.m_mapping[color] = area 

    def flags(self, index): 
     return Qt.ItemIsEditable | Qt.ItemIsEnabled 
     # if (index.column() == 0): 
     #  return Qt.ItemIsEditable | Qt.ItemIsEnabled 
     # else: 
     #  return Qt.ItemIsEnabled 

    def index(self, row, column, parent=None, *args, **kwargs): 
     if self.hasIndex(row,column,parent): 
      return self.createIndex(row,column,self.m_data[row]) 
     return QModelIndex() 

    def parent(self, index=None): 
     return QModelIndex() 

    def insertRows(self): 
     self.beginInsertRows(QModelIndex(), self.m_row_count, self.m_row_count) 

     self.m_data.append([0,0]) 
     self.m_row_count += 1 
     self.add_mapping(self.color, QRect(0, 0, 2, self.rowCount())) 
     self.endInsertRows() 
     return True 

    def removeRows(self): 
     self.beginRemoveRows(QModelIndex(), self.m_row_count, self.m_row_count) 
     self.m_data.pop() 
     self.m_row_count -= 1 
     self.endRemoveRows() 

     return True 

    def add_row(self): 
     self.insertRows() 

    def remove_row(self): 
     if self.m_row_count>0: 
      self.m_row_count -= 1 
      self.removeRows() 

やウィジェット内またはちょうどにあなたのボタンのクリックを接続するものは何でも、あなたのボタンがあります。

はボタンでクリックしたときに私は、私のテーブルの行を追加することを、この小さな例を持っています上記のアイテムモデルからラインメソッドを挿入して削除します。

#... 
    def create_connections(self): 
     self.btn_add_line.clicked.connect(self.table.model().insertRows) 
     self.btn_remove_line.clicked.connect(self.table.model().remove_row) 
#... 

今、あなたはちょうどなきゃあなたが上書きモデルにあなたのテーブルビューからモデルを設定します。

+0

私はQTableWidgetを使用していますが、モデルを作成する必要がありますか? – Manish

+0

@Manish QTableWidgetを選択した場合は、独自のモデルを持つ必要はありません。それはすでにはるかに堅牢で、あなたが必要なことをするために使うことができる多くの独自の機能を持っています。そうでなければ、メモリを気にして、それを無駄にしたくないなら、独自のパーソナライズされたQAbstractItemModelでQTableViewを使用する。要約すると、QTableWidgetはQTableViewであり、多くのことが既に実装されています。 ") – yurisnm

+0

QTableViewはQTableWidgetと大きく異なるので、私はQTableWidgetを示す新しい例が必要だと思います。 –

関連する問題