2013-01-29 3 views
0

사용자 지정된 qtablemodel 및 qtableview가 있습니다. 사용자가 여러 행을 선택할 수 있고이 행의 값 중 하나를 변경하여 기능을 추가하고 싶습니다. 그는 실제로 모든 행에서이 값을 변경합니다. 예 : 사용자는 전체 테이블을 선택할 때 테이블에있는 모든 사람의 이름을 앨리스로 변경할 수 있습니다.qtableview에서 여러 행을 업데이트하는 방법은 무엇입니까

이 문제를 해결할 수 있습니까?

다른 행에 대해 모델의 setData를 여러 번 트리거하는 방법을 이해할 수 없습니다. 또는 모델 내의 setData 함수가 호출되기 전에 qtableview가 모델로 보내는 신호를 알 수 있습니까? 사전 도니

+0

QTableModel' '같은 것은 없습니다. QStandardItemModel을 사용하고 있습니까? – Phlucious

+0

어쨌든 공용 인터페이스가 없습니다. – Phlucious

+0

죄송합니다. public QAbstractTableModel 및 flags(), data(), setData(), headerData(), setHeaderData(), columnCount() 및 rowCount()를 덮어 쓰는 클래스 MyModel을 사용하고 있습니다. 그리고 다른 한편으로는 MyTableView : public QTableView를 사용하고 있습니다 ... – Donny

답변

0

에 많은 당신에 따라

덕분에 모델/뷰를 구현 한, 당신은 모든 선택 항목을 통해 슬롯이 사이클을 QAbstractItemModel::dataChanged 신호를 연결할 수 있습니다. setData의 모든 버전이이 신호를 방출하는 것은 아니지만 재정의 한 경우 그렇게 할 수 있습니다.

예를 들어 QTableWidgetItem :: setData의 소스 코드를 살펴보십시오. qtablewidget.cpp 파일에 있습니다.


편집 : 또는 편집기의 값을 차단하고 모든 선택된 항목에 적용하거나 대리인의 closeEditor 또는 commitData 신호에 열쇠 수 있습니다. 당신은이 작업을 수행 할 수 QTableView를 서브 클래스해야 할 것입니다, 그래서 여기에 당신이 here에서 영감을 시작하려면 약간의 샘플 코드입니다 : 여러 선택을위한 특별한 케이스 QStyledItemDelegate을 무시할 수, 세 번째 옵션으로

class MyTableView : public QTableView { 
    Q_OBJECT 
public: 
    explicit MyTableView(QWidget* parent = 0) : QTableView(parent) { 
     connect(this->itemDelegate(), SIGNAL(closeEditor(QWidget*)), 
       this, SLOT(editMultipleItems(QWidget*))); 
    } 

public slots: 
    void editMultipleItems(QWidget* editor) { 
     QLineEdit* myeditor = qobject_cast<QLineEdit*>(editor);  //recast to whatever widget was actually used 
     if(myeditor != 0) { 
      foreach(const QModelIndex& index, this->selectionModel()->selectedIndexes()) { 
       QVariant v(myeditor->text()); 
       model()->setData(index, v, Qt::EditRole); 
      } 
     } 
    } 
}; 

는, 다음 사용자 지정 setModelData()를 사용하여 을 편집 트리거를받은 것 대신 모든 항목을 편집하십시오.

또한 새 값으로 MyTableView의 multiItemEdit 슬롯에 연결된 신호를 서브 클래 싱 된 QStyleItemDelegate :: setModelData()에서 내보내는 두 번째 및 세 번째 옵션을 결합 할 수도 있습니다.

+0

나는 확실히 모르겠지만 만약 내가 다른 선택과 함께 여러보기를 가지고이 문제가 발생할 수 있습니다 같아요. 플러스 내가 3 셀을 선택한 경우 하나의 셀 내용을 변경합니다. 이렇게하면 model :: setData()가 호출되어 "datachanged"신호로 뷰를 다시 호출합니다. 그래서 이것은 선택 항목을 반복하고 모든 선택된 행()에 대해 setData를 호출하여 같은 호출을 계속 반복하여 수행합니다. – Donny

+0

현재 값이 설정하려는 값과 같을 경우 반환되는 setData 내에 이스케이프 컨트롤을 포함 할 수 있지만 그럴 수도 있습니다. – Phlucious

+0

두 번째 및 세 번째 옵션에 대한 수정 내용을 참조하십시오. 나는 어둠 속에서 조금씩 쏘고 있지만, 나는 너와 비슷한 것을 할 필요가있다. – Phlucious

0

QTableView :: selectedIndexes()에서 QModelList를 가져올 수 없습니까?

+0

문제는 모든 단일 edittrigger가 QAbstractItemView :: edit (QModelIndex & index)를 호출한다는 것입니다. 따라서 QTableView :: selectedIndexes()를 반복하기 위해 모든 편집 트리거를 덮어 써야합니다. 그래서 나는 약간의 방아쇠를 그리워 할 것이라고 확신한다. 나는 더 쉽고 더 일반적인 방법을 찾기를 희망했다. – Donny

+0

이것은 필자가 제안한 두 번째 옵션이다. [closeEditor()]에 의해 트리거 된 슬롯에서 [selectedIndexes()] (http://qt-project.org/doc/qt-4.8/qtableview.html#selectedIndexes)를 반복 할 경우 (http : // doc- snapshot.qt-project.org/4.8/qabstractitemdelegate.html#closeEditor), 거기에서 항목의 데이터를 설정하기 만하면 새 편집기가 열리지 않습니다. – Phlucious

1

동일한 열의 모든 선택된 값을 동시에 편집하는 문제를 좀 더 간단하게 해결할 수도 있습니다. QTableView :: edit()를 재정의하는 대신 사용자가 편집을 제출 한 후에 호출되는 QTableView :: commitData (편집기)를 재정의하는 것이 더 쉽습니다.

간단히 말해서 : 사용자가 편집을 전송하면 선택한 다른 모든 행을 반복하고 편집 된 셀과 같은 열의 셀에 정확히 동일한 값 변경을 적용합니다.

여기 파이썬 예제, C++로 번역 (사방에 세미콜론을 추가, thisself 교체) 쉬워야한다 :

class ImageTableView(QtGui.QTableView): 
    def commitData(self, editor): 
     # call parent commitData first 
     super(ImageTableView, self).commitData(editor) 

     # self.currentIndex() is the QModelIndex of the cell just edited 
     theModel = self.currentIndex().model() 
     # get the value that the user just submitted 
     value = theModel.data(self.currentIndex(), QtCore.Qt.EditRole) 

     curRow, curCol = self.currentIndex().row(), self.currentIndex().column() 

     # selection is a list of QItemSelectionRange instances 
     for isr in self.selectionModel().selection(): 
      rows = range(isr.top(), isr.bottom()+1) 
      for row in rows: 
       if row != curRow: 
        # row,curCol is also in the selection. make an index: 
        idx = theModel.index(row, curCol) 
        # so we can apply the same value change 
        theModel.setData(idx, value, QtCore.Qt.EditRole)