2011-08-15 2 views
2

델리게이트를 사용하여 QDataWidgetMapper를 사용할 때 모델의 데이터가 표시되는 방식을 사용자 정의하려고합니다.QDataWidgetMapper 및 QLabel과 함께 델리게이트 사용

두 가지 버전의 위젯이 있습니다. 하나는보기 전용 (데이터는 QLabels에 표시됨)이고 다른 하나는 데이터를 편집하는 데 사용됩니다 (데이터는 적절한 편집기에 표시됨).

후자는 위임자와 완벽하게 작동하지만 모든 것이 좋습니다.

첫 번째 모델에서 문제가 발생했다고 생각 했으므로 ... QDataWidgetMapper를 사용하여 내 모델의 섹션을 QLabels에 매핑 할 때 대리인이 호출되지 않고 일반 데이터가있는 섹션에 대해 데이터가 올바르게 표시됩니다 (문자열, ints, ...)하지만 대리자를 사용하여 문자열 형식을 지정하려는 사용자 지정 데이터 형식 (목록의 종류)이있는 모델의 섹션에는 데이터가 표시되지 않습니다.

데이터가 표시 될 때 위임자의 paint() 메서드가 호출되는 QTableView에 동일한 데이터가 표시 될 때 이미이 작업을 성공적으로 수행했습니다.

QLabels를 사용하여 데이터를 표시 할 때 해당 메서드를 사용하여 QDataWidgetMapper에 대리자를 명시 적으로 연결했지만 대리자가 호출되지 않는다는 것을 알았습니다. setItemDelegate().

void CustomItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { 
    qDebug() << "DELEGATE: PAINT" << index.column(); 
    QStyledItemDelegate::paint(painter, option, index); 
} 

void CustomItemDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const { 
    qDebug() << "DELEGATE: SET EDITOR DATA" << index.column(); 
    QStyledItemDelegate::setEditorData(editor, index); 
} 

그 안에 다음과 같이 위젯 :

QDataWidgetMapper* mapper = new QDataWidgetMapper(); 
CustomItemDelegate* delegate = new CustomItemDelegate(); 
mapper->setModel(model); 
mapper->setItemDelegate(delegate); 

mapper->addMapping(editorWidget, 1); 
mapper->addMapping(label, 2, "text"); 

mapper->toFirst(); 

QTableView* view = new QTableView(); 
CustomItemDelegate* delegate2 = new CustomItemDelegate(); 
view->setModel(model); 
view->setItemDelegate(delegate2); 

코드 출력 :

DELEGATE: SET EDITOR DATA 1 
// NOTHING ?! 

DELEGATE: PAINT 1 
DELEGATE: PAINT 2 

그래서 합성 가상 메소드를 QStyledItemDelegate 상속 클래스 CustomItemDelegate 가정

그리고 결과적으로 나는

가되었습니다. 는
    올바른 거기에 데이터를 내 editorWidget
  • : 내 레이블 데이터 만 표시
  • (섹션에 포함 된 어떤 데이터 유형 한 에디터는 과정의 유형을 처리로 일반 또는 사용자 정의) 섹션이 포함되어있는 경우 대리자는
  • 내보기는 대리인으로 좋은 모든 것을 표시 할 것이라고되지 않는 데이터의 일반 유형은 그래서 내 질문은 각 섹션

위해 호출됩니다

    ,
  • 매핑 된 위젯이 QLabel 일 때 왜 대리인이 호출되지 않습니까?
  • 이 경우 데이터 유형이 정규 일 때 데이터가 어떻게 표시됩니까? 마법?

덕분에 아주 많이 나는 대답이 명백한 경우 (그렇다하더라도하지만, 그것을 지적 주셔서 감사합니다 : P를) 미리 사과이 QT에서 코드

ixM

답변

3

에게, 그 첫 번째 경우에서 위젯

void QDataWidgetMapperPrivate::populate(WidgetMapper &m) 
{ 
    if (m.widget.isNull()) 
     return; 

    m.currentIndex = indexAt(m.section); 
    if (m.property.isEmpty()) 
     delegate->setEditorData(m.widget, m.currentIndex); 
    else 
     m.widget->setProperty(m.property, m.currentIndex.data(Qt::EditRole)); 
} 

당신이 부동산 대리인이 데이터는 대리인을 전달하여 직접 를 위젯으로 설정되어 두 번째 경우에 반면에 사용되는 지정하지 않는 경우 웁니다.

왜 이런 식으로 설계되었지만 현재 작동하는지는 알 수 없습니다.

+1

감사합니다. 사실 QDataWidgetMapper의 소스를 살펴 보았지만이 사실을 간과해서 분명히했습니다. 단순히 "text"속성을 제거하면 대리자의 메서드 페인트를 사용할 수 있습니다. 감사합니다. – ixM

관련 문제