2014-11-17 2 views
0

Hi Python Эксперты PyQt4:Как программно изменять/обновлять данные в Python PyQt4 TableView?

Я хотел бы иметь таблицу в окне QWidget и обновлять таблицу каждый раз, когда пользователь вводит значение в поле lineEdit. Как это сделать программно?

Статус: Я получаю следующее сообщение об ошибке в код: TypeError: QAbstractTableModel.beginInsertRows (QModelIndex, Int, Int): аргумент 2 имеет неожиданный тип 'ул'

from PyQt4 import QtGui , QtCore 
import sys 

try: 
    _fromUtf8 = QtCore.QString.fromUtf8 
except AttributeError: 
    _fromUtf8 = lambda s: s 


class ABCTableModel(QtCore.QAbstractTableModel): 
    def __init__(self,data,parent=None): 
     QtCore.QAbstractTableModel.__init__(self,parent) 
     self.__data=data  # Initial Data 

    def rowCount(self, parent): 
     return len(self.__data) 

    def columnCount(self , parent): 
     return len(self.__data) 

    def data (self , index , role): 
     if role == QtCore.Qt.DisplayRole: 
      row = index.row() 
      column = index.column() 
      value = self.__data[row][column] 
      return QtCore.QString(str(value)) 

    def setData(self, index, value): 
     self.__data[index.row()][index.column()] = value 
     return True 

    def flags(self, index): 
     return QtCore.Qt.ItemIsEnabled|QtCore.Qt.ItemIsEditable|QtCore.Qt.ItemIsSelectable  

    def insertRows(self , position , rows , item , parent=QtCore.QModelIndex()): 
     # beginInsertRows (self, QModelIndex parent, int first, int last) 
     self.beginInsertRows(QtCore.QModelIndex(),position,position) 
     self.__data.append(item) # Item must be an array 
     self.endInsertRows() 
     return True 

class Ui_MainWindow(QtGui.QMainWindow , QtGui.QWidget): 
    def __init__(self): 
     QtGui.QMainWindow.__init__(self,None) 
     QtGui.QWidget.__init__(self,None) 

    def setupUi(self, MainWindow): 
     self.centralwidget = QtGui.QWidget(MainWindow) 
     self.centralwidget.setObjectName(_fromUtf8("centralwidget")) 
     self.tableView = QtGui.QTableView(self.centralwidget) 
     self.tableModel=ABCTableModel([[1,2,3],[2,3,4],[4,5,6]]) 
     self.tableView.setModel(self.tableModel) 
     self.lineEdit_1 = QtGui.QLineEdit(self.centralwidget) 
     self.lineEdit_2 = QtGui.QLineEdit(self.centralwidget) 
     self.lineEdit_3 = QtGui.QLineEdit(self.centralwidget) 
     self.tableModel.insertRows(self.lineEdit_1.text(),self.lineEdit_2.text(), self.lineEdit_3.text()) 

if __name__ == "__main__": 
    app = QtGui.QApplication(sys.argv) 
    MainWindow = QtGui.QMainWindow() # <-- Instantiate QMainWindow object. 
    ui = Ui_MainWindow() 
    ui.setupUi(MainWindow) 
    MainWindow.show() 
    sys.exit(app.exec_()) 

ответ

3

Вы должны реализовать Model View Programming для этого. Программирование Python Model View довольно просто.

Прикрепите модель к вашему TableView и возьмите ввод в свой LineEdit и вставьте его в модель, и остальная часть работы будет рассмотрена.

from PyQt4 import QtGui , QtCore 
import sys 
class ABCTableModel(QtCore.QAbstractTableModel): 
    def __init__(self,data,parent=None): 
     QtCore.QAbstractTableModel.__init__(self,parent) 
     self.__data=data  # Initial Data 

    def rowCount(self, parent): 
     return len(self.__data) 

    def columnCount(self , parent): 
     return len(self.__data[]) 

    def data (self , index , role): 
     if role == QtCore.Qt.DisplayRole: 
      row = index.row() 
      column = index.column() 
      value = self.__data[row][column] 
      return QtCore.QString(str(value)) 

    def setData(self, index, value): 
     self.__data[index.row()][index.column()] = value 
     return True 

    def flags(self, index): 
     return QtCore.Qt.ItemIsEnabled|QtCore.Qt.ItemIsEditable|QtCore.Qt.ItemIsSelectable  

    def insertRows(self , position , rows , item , parent=QtCore.QModelIndex()): 
     # beginInsertRows (self, QModelIndex parent, int first, int last) 
     self.beginInsertRows(QtCore.QModelIndex(),len(self.__data),len(self.__data)+1) 
     self.__data.append(item) # Item must be an array 
     self.endInsertRows() 
     return True 

class Ui_MainWindow(QtGui.QMainWindow , QtGui.QWidget): 
    def __init__(self): 
     QtGui.QMainWindow.__init__(self,None) 
     QtGui.QWidget.__init__(self,None) 

    def setupUi(self, MainWindow): 
     self.centralwidget = QtGui.QWidget(MainWindow) 
     self.centralwidget.setObjectName(_fromUtf8("centralwidget")) 
     self.tableView = QtGui.QTableView(self.centralwidget) 
     self.tableModel=ABCTableModel([[1,2,3],[2,3,4],[4,5,6]]) 
     self.tableView.setModel(self.tableModel) 
     self.lineEdit_1 = QtGui.QlineEdit(self.centralwidget) 
     self.lineEdit_2 = QtGui.QlineEdit(self.centralwidget) 
     self.lineEdit_3 = QtGui.QlineEdit(self.centralwidget) 
     self.tableModel.insertRows(self.lineEdit_1.text(),self.lineEdit_2.text(), self.lineEdit_3.text()) 

if __name__ == "__main__": 
    app = QtGui.QApplication(sys.argv) 
    MainWindow = QtGui.QMainWindow() # <-- Instantiate QMainWindow object. 
    ui = Ui_MainWindow() 
    ui.setupUi(MainWindow) 
    MainWindow.show() 
    sys.exit(app.exec_()) 
+0

Спасибо за ваш ответ. Я получил несколько ошибок и смог обновить соответственно. Однако я все еще получаю следующую ошибку: TypeError: QAbstractTableModel.beginInsertRows (QModelIndex, int, int): аргумент 2 имеет неожиданный тип 'str'. Вот обновленный код: от PyQt4 импорта QtGui, QtCore импорт SYS попробовать: _fromUtf8 = QtCore.QString.fromUtf8 кроме AttributeError: _fromUtf8 = лямбда s: s –

+0

класс ABCTableModel (QtCore.QAbstractTableModel): Защиту __init__ (не сам, данные, родитель = None): QtCore.QAbstractTableModel .__ INIT __ (самостоятельно, родитель) Селф .__ данные = данные # Исходные данные защиту ROWCOUNT (я, родитель): возврата Len (Self .__ данных) def columnCount (self, parent): return len (self .__ data) def data (self, index, role): if role == QtCore.Qt.DisplayRole: row = index.row() column = index.column() value = self .__ data [row] [column] return QtCore.QString (str (значение)) –

+0

@CM: Я обновил код, взгляните. Чтобы понять, что я сделал, посмотрите: http: //pyqt.sourceforge.net/Docs/PyQt4/qabstractitemmodel.html#beginInsertRows – TheCreator232

Смежные вопросы