2017-05-11 45 views
1

我已经创建了一个表,我希望该行应该基于单击一个按钮来创建。我创建了一个表格,但没有分配rowcount。当我运行程序时,它显示没有任何行的表格(显示标题标签等)。到目前为止,一切都很好。我把一个按钮添加一行,并写了下面的代码:QTableWidget:插入行崩溃应用程序python

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

应用程序只是退出。

如果我尝试:

self.tableWidget.setRowCount(count+1) 

它增加了一行。假设我按行输入了一些数据,并再次调用

self.tableWidget.setRowCount(count+1) 

它删除一行的数据。

我的问题是:

我们可以使用没有的InsertRow设置setRowCount?

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

+0

'setRowCount'用'count'调用。每次都是相同的值吗? –

+0

它应该是'insertRow'小写'我' –

+0

@DavidChing感谢您的意见。随着每次通话,计数都会增加。当我运行程序时,它会添加该行。假设创建了3行,并在行中输入了用户输入的数据。现在用户想要添加更多的行和数据。当调用setRowCount时,会添加一个空行,但删除一个现有行的数据:-(。 – Manish

回答

0

我可以实现一些简单的事情来准确地显示你所要求的内容,但是我只是实现了类似于你需要的东西,我需要做你需要从表中获取数据并填写我的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你改写模型设置的模型。

+0

感谢您的快速和详细的回复。看起来你使用的是QTableView,我们使用的是数据模型,我使用的是QTableWidget,我需要创建模型吗?我想模型只是用于查看模型 – Manish

+0

@Manish如果你选择QTableWidget,你不需要有你自己的模型。它已经更强大,并有许多自己的功能,你可以用它来做你所需要的,否则如果你关心记忆,而你不想浪费它,我会建议你将QTableView与您自己的个性化QAbstractItemModel一起使用。总而言之,QTableWidget是一个QTableView,其中已经实现了许多功能。 “) – yurisnm

+0

QTableView与QTableWidget不同,我认为需要一个显示QTableWidget的新示例。 –