2016-08-05 3 views
0

레이블, 텍스트 편집 및 확인 버튼이있는 열이 포함 된 트리 모델 뷰가 이미 있습니다. 내가 추가하려고하는 것은 푸시 버튼입니다. 여기에 내가 갇혀있다 :트리 뷰의 열의 QPushButton

  1. 내가 사용하는 "플래그"기능에는 어떤 것이 있습니까?
  2. "데이터"기능에서 푸시 버튼의 역할은 무엇입니까? (예 : Qt::CheckStateRole을 사용한 체크 버튼의 경우)
  3. "데이터"함수 (QVariant을 반환)에서 무엇을 반환해야합니까? 버튼이 생성 되었습니까?

이 주제에 관한 다른 답변과 가장 일반적인 대답은 setIndexWidget을 사용하여 제안되었지만 잘 모르겠습니다. 마지막으로, UI 디자이너를 사용하지 않고 프로그래밍 방식으로이 작업을 시도하고 있습니다.

감사합니다.

답변

0

다른 것들보다 먼저, Qt의 모델/뷰 프레임 워크가 어떻게 작동하는지 조금 혼란스럽게 보입니다. 나는 당신이 그것에 대해 Qt는 설명서를 확인 가라고 : 당신의 세 질문에 http://doc.qt.io/qt-5/model-view-programming.html

답변 :

  1. 당신은 Qt::ItemFlags QAbstractItemModel::flags(const QModelIndex &index) const의 모든 네임 스페이스를 사용할 필요가 없습니다합니다. 귀하의 색인에 맞는 Qt::ItemFlags (즉, Qt::ItemFlag의 조합)을 반환하십시오. 이것은 당신이보기에 QPushButton을 원한다는 사실과 아무 관련이 없습니다. 난 당신이보기를 확인란을 표시하게 Qt::ItemIsUserCheckable 플래그로 혼란스러워 생각합니다. 그러나 이것이이 플래그가 실제로하는 것은 아니며 실제로는 사용자가 인덱스의 Qt::CheckStateRole을 변경하는 의미를 제공한다고 알려줍니다. 보기의 기본 동작은 QCheckBox이라는 표시로 수행하는 것입니다.

  2. 누름 단추와 관련된 역할이 없습니다. Qt::CheckStateRole 또는 Qt::EditRole을 사용할 수 있으며, 이는 QPushButton을 표시하도록 선택한 방법에 따라 다릅니다. role입니다 Qt::CheckStateRole 또는 Qt::EditRole, 당신은 QPushButton의 상태를 제어하는 ​​부울을 반환 할 수 있습니다 QVariant QAbstractItemModel::data(const QModelIndex &index, int role = Qt::DisplayRole) const에서

  3. . 그러나 절대로 QWidget (또는 파생 된)을 반환하면 안됩니다. 모델은 데이터가 표시되는 방식이 아니라 데이터를 처리합니다.

용액 : 구현할 QAbstractItemDelegate (또는 QStyledItemDelegate). 다시 쓰기 :

  • createEditor() : QPushButton을 작성하십시오.
  • setEditorData() : QAstractItemModel::data()에서 사용한 색인과 역할을 사용하여 QPushButton 상태로 설정하십시오.
  • setModelData() : QPushButton 상태에 따라 모델을 업데이트하십시오.

보기 (QTreeView::setItemDelegateForColumn())에서 대리인을 설정하십시오.이 시점에서 편집중인 경우에만 누름 단추가 나타납니다. 그런 다음 항상 표시되도록 QAbstractItemView::openPersistentEditor()으로 전화 할 수 있습니다.

+0

QAbstractItemModel을 사용해야한다고 언급 했으므로 현재 MTreeModel을 다시 작성하지 않고도 구현할 수 있습니까? –

+0

QAbstractItemModel은 모든 모델 클래스의 기본 클래스이므로 MTreeModel이 QAbstractItemModel을 상속 받았다는 것을 확신하므로 QAbstractItemModel에 대한 모든 내용이 MTreeModel에 적용됩니다. –

+0

감사합니다. 지금은 더 잘 이해하고 있다고 생각합니다. 반환 값 유형이 함수 유형과 일치하지 않습니다. QWidget colorDelegate :: * createEditor (QWidget * parent, const QStyleOptionViewItem & option, const QModelIndex & index) { \t QPushButton * button = new QPushButton (const_cast (부모)); \t button-> setText ("Push"); \t 돌아 가기 단추; } –