python - QTableWidget:插入行使应用程序崩溃 python

标签 python pyqt qtablewidget

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

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

应用程序直接退出。

如果我尝试:

self.tableWidget.setRowCount(count+1)

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

self.tableWidget.setRowCount(count+1)

删除一行数据。

我的问题是:

我们可以在不设置setRowCount的情况下使用InsertRow吗?

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

最佳答案

我可以实现一些更简单的东西来准确显示您所要求的内容,但我只是实现了与您需要的类似的东西,我需要做您需要的事情来从表中获取数据并填写我的 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)
#...

现在您只需将表格 View 中的模型设置为您覆盖的模型即可。

关于python - QTableWidget:插入行使应用程序崩溃 python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43915108/

相关文章:

python - Qt 菜单快捷方式抢占子部件 KeyPressEvents

python - 如何使项目 View 在 PyQt 中呈现丰富的 (html) 文本?

qt - 对 QTableWidget 执行撤消和重做操作

python - 如果我们使用管道,我怎样才能得到树解释器的树贡献?

python - 如果列表中的数字等于n,则打印出它们的索引

python - 如何在pyqt上构建鼠标悬停时显示的侧栏菜单?

c++ - 向 QTableWidget 添加水平 slider

python - 动态创建选项卡QTabWidget和填充表格QTableWidget

python - 如果指定用户名,为什么我的 getopts 会失败?

python - 为什么 PyAutoGui LocateOnScreen() 只返回 None