Python QTableWidget:Insert row使应用程序崩溃
我已经创建了一个表,我希望该行应该基于单击一个按钮来创建。我创建了一个表,但没有分配行数。当我运行程序时,它会显示没有任何行的表(显示标题标签等)。到目前为止一切都很好。我放置了一个按钮来添加一行,并编写了以下代码:Python QTableWidget:Insert row使应用程序崩溃,python,pyqt,qtablewidget,Python,Pyqt,Qtablewidget,我已经创建了一个表,我希望该行应该基于单击一个按钮来创建。我创建了一个表,但没有分配行数。当我运行程序时,它会显示没有任何行的表(显示标题标签等)。到目前为止一切都很好。我放置了一个按钮来添加一行,并编写了以下代码: self.tableWidget.InsertRow(self.tableWidget.rowCount()+1) 应用程序只是退出 如果我尝试: self.tableWidget.setRowCount(count+1) 它添加行。假设我在行中输入一些数据,然后再次调用 se
self.tableWidget.InsertRow(self.tableWidget.rowCount()+1)
应用程序只是退出
如果我尝试:
self.tableWidget.setRowCount(count+1)
它添加行。假设我在行中输入一些数据,然后再次调用
self.tableWidget.setRowCount(count+1)
它删除一行的数据
我的问题是:
我们可以在不设置setRowCount的情况下使用InsertRow吗
当我多次调用setRowCount时,为什么它会删除行中填充的数据(使用UI)?我可以实现一些更简单的方法来精确显示您的要求,但我只是实现了一些与您需要的类似的方法,我需要做您需要做的事情,以便从表中获取数据并填写我的QLineChart 总之,您必须根据需要覆盖QabstracteModel所需的所有方法 有一个小示例,我在单击按钮时在表的和中添加了一行:
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
,带有小写的i
@DavidChing谢谢您的评论。每次呼叫,计数都会增加。当我运行程序时,它会添加行。假设创建了3行,用户在其中输入了数据。现在,用户希望再添加一行和数据。调用setRowCount时,将添加一个空行,但删除一个现有行的数据:-(.我尝试使用小写字母I,但它没有添加任何行。你用这个神秘的计数来调用setRowCount。它设置为什么?感谢你快速详细的回答。看起来你在使用数据模型的地方使用了QTableView。我在使用QTableWidget,我需要创建模型吗?我想模型只用于查看。@如果你选择QTableWidget,请使用Manish你不需要有自己的模型。它已经更加健壮,并且有许多自己的功能可以用来做你需要的事情,否则如果你关心内存并且不想浪费它,我建议你将QTableView与你自己的个性化qabstractemodel一起使用。总之,QTableWidget是一个已经有很多东西的QTableViewQTableView与QTableWidget如此不同,我认为需要一个显示QTableWidget的新示例。
#...
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)
#...