2012-09-25 6 views
1

지연. 다음 코드에서는 사용자가 셀을 클릭 할 때 필터가 적용되는지 여부에 관계없이 선택된 텍스트가 표시되도록 관리했습니다. 그러나 항상 1 클릭 뒤이며 시작 후 첫 번째 클릭은 IndexError: pop from empty list이되고 같은 열에서 새 열이 선택되면 아무 일도 발생하지 않습니다.PyQt4 내가 레코드를 필터링 할 <code>QSortFilterProxyModel</code>를 사용과 함께 <code>QSqlTableModel</code>의 내용을 표시하는 <code>QTableView</code>를 사용하고 한 번의 클릭

테이블을 초기화 한 후 색인을 선택하려고했지만 아무 것도하지 않는 것 같습니다. 나는 다음에 무엇을 시도 할 것인가에 대한 아이디어가 없다.

class TableViewer(QtGui.QWidget): 

    self.model = QSqlTableModel() 
    self._proxyModel = QtGui.QSortFilterProxyModel() 
    self._proxyModel.setSourceModel(self.model) 

    self.tv= QTableView() 
    self.tv.setModel(self._proxyModel) 

    '''Call-able filter - pass in string to filter everything that doesn't match string''' 
    QtCore.QObject.connect(self.textEditFilterBox, QtCore.SIGNAL("textChanged(QString)"),  self._proxyModel.setFilterRegExp) 


    def getItem(self): 
     '''Retruns item text of selected item''' 
     index = self.selectionModel.selectedIndexes().pop() 
     if index.isValid(): 
      row = index.row() 
      column = index.column() 
      model = index.model() 
      if hasattr(model, 'mapToSource'): 
       #proxy model 
       modelIndex = model.mapToSource(index) 
       print (modelIndex.row(), modelIndex.column()) 
       return self.model.record(modelIndex.row()).field(modelIndex.column()).value().toString() 
     return self.model.record(row).field(column).value().toString() 

class MainWindow(QtGui.QMainWindow): 

    #initialize TableViewer 

    self.tblViewer.connect(self.tblViewer.tv.selectionModel(), 
      SIGNAL(("currentRowChanged(QModelIndex,QModelIndex)")), 
      self.tblItemChanged) 

    def tblItemChanged(self, index): 
     '''display text of selected item ''' 
     text = self.tblViewer.getItem() 
     print(text) 

답변

1

새로운 열은 아무런 변화가 같은 행 내에서 선택 될 때.

currentRowChanged 신호를 사용했기 때문입니다. 같은 행의 열을 선택하면 해당 신호가 시작되지 않습니다. currentChanged 신호를 사용해야합니다. 당신은 단지 데이터 후에있는 경우 QModelIndex이 편리한 방법이있다 등의 모델을 물어 그런 다음 비 프록시 QModelIndex를 얻을하고 그 물건을 필요하지 않습니다,

을 (그리고, 당신은 new style connections를 사용한다) 그리고 .data이 목적을위한 것입니다. 게다가, 신호가 당신에게 선택한 색인을 보내드립니다, 당신은 그것에 대한 여분의 작업이 필요하지 않습니다. 이것은이 같은 코드를 간단하게 : (참고 : getItem 방법이 필요하지 않습니다)

class MainWindow(QtGui.QMainWindow): 
    def __init__(self, parent=None): 
     #initialize TableViewer 
     self.tblViewer.tv.selectionModel().currentChanged.connect(self.tblItemChanged) 

    def tblItemChanged(self, current, previous): 
     '''display text of selected item ''' 
     # `data` defaults to DisplayRole, e.g. the text that is displayed 
     print(current.data().toString()) 
+0

훨씬 간단하고 완벽하게 감사를 작동합니다. (나는 새로운 스타일을 모르고 있었고, 다시 깨끗하게 보였다.) –