QTableWidget:Insert row使应用程序python崩溃

2024-04-26 01:11:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经创建了一个表,我希望在单击一个按钮的基础上创建行。我创建了一个表,但没有分配行数。当我运行程序时,它显示没有任何行的表(显示标题标签等)。到目前为止一切都很好。我放了一个按钮来添加一行,并编写了以下代码:

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

应用程序只是退出。在

如果我尝试:

^{pr2}$

它添加行。假设我在行中输入了一些数据,然后再次调用

^{pr2}$

它删除一行的数据。在

我的问题是:

我们可以使用InsertRow而不设置setRowCount吗?在

当我多次调用setRowCount时,它为什么要删除行中填充的数据(使用UI)?在


Tags: 数据代码self程序应用程序ui标题标签
1条回答
网友
1楼 · 发布于 2024-04-26 01:11:28

我可以实现一些更简单的方法来精确地显示您所要求的,但我只是实现了与您需要的类似的东西,我需要做您需要做的事情来从表中获取数据并填写QLineChart。在

总之,您必须根据需要覆盖qabstractemmodel需要的所有必需方法。在

有一个小例子,当我点击一个按钮时,我会在表格的和中添加一行:

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()

在widget或任何你有按钮的地方,只需将你的按钮点击连接到上面的项目模型中的insert and remove line方法。

^{pr2}$

现在您只需将表视图中的模型设置为您重写的模型。

相关问题 更多 >