私はあなたが求めているものを正確に表示するために簡単なものを実装することができますが、必要なものに似たものを実装しました。テーブルからデータを取得して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)
#...
今、あなたはちょうどなきゃあなたが上書きモデルにあなたのテーブルビューからモデルを設定します。
'setRowCount'は' count'で呼び出されます。それは毎回同じ値ですか? –
'insertRow'は小文字の' i'であるべきです。 –
@DavidChingコメントありがとうございます。カウントはすべてのコールごとに増分しています。プログラムを実行すると、行が追加されます。 3行が作成され、ユーザーが行にデータを入力したとします。ユーザーはもう1行とデータを追加します。 setRowCountが呼び出されると空白の行が1つ追加されますが、既存の行のデータは削除されます。 – Manish