我可以实现一些简单的事情来准确地显示你所要求的内容,但是我只是实现了类似于你需要的东西,我需要做你需要从表中获取数据并填写我的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)
#...
现在只是你必须从你的tableview你改写模型设置的模型。
'setRowCount'用'count'调用。每次都是相同的值吗? –
它应该是'insertRow'小写'我' –
@DavidChing感谢您的意见。随着每次通话,计数都会增加。当我运行程序时,它会添加该行。假设创建了3行,并在行中输入了用户输入的数据。现在用户想要添加更多的行和数据。当调用setRowCount时,会添加一个空行,但删除一个现有行的数据:-(。 – Manish