Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python QTableWidget:Insert row使应用程序崩溃_Python_Pyqt_Qtablewidget - Fatal编程技术网

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)
#...