2016-10-26 3 views
2

사용자 지정 대리자를 만들 때 createEditor(), setEditorData()setModelData()을 구현합니다. 나는 다음과 같은 문제에 직면하고있다. createEditor()의 모든 예제는 QComboBox 나 QLineEdit 같은 간단한 것들을 사용합니다. 이것은 show() 또는 exec() 멤버 함수가 없으며 QDialog를 사용할 때마다 프로그램에서 정의되지 않은 동작을 보입니다. 그리고 QDialog가 나타납니다. 그러나 미친 짓. 몇 가지 신호/슬롯 마법을 사용하여 프로그램을 만들었지 만 설명 된 표준 패턴을 사용하여 구현하고 싶습니다. 예를 들어 http://cep.xray.aps.anl.gov/software/qt4-x11-4.2.2/model-view-delegate.html 어떻게 할 수 있습니까?커스텀 델리게이트에 QDialog를 고정시키는 방법은 무엇입니까?

정의되지 않은 동작에 직면했을 때 어떤 일이 일어나는지 자세히 설명하려면 createEditor()에서 QDialog의 부모를 설정하면 QDialog가 표시되지 않습니다. 설정하지 않으면 표시됩니다. 그것 주위에 그것을 드래그 (이것은 어쨌든 잘못이며 내가 그렇지 않으면 내가 메모리 누수가 있기 때문에 나는 항상 부모를 설정해야한다고 생각) 사라집니다. 내 질문에, 내 질문에 종기가 : 어떻게하면 QDialog 제대로 표시 할 수 있습니까? 나는 setEditorData(), setModelData() 및 createEditor()의 다른 부분에 show() 및 exec()를 사용하려고 시도했지만 아무 것도 제대로 작동하지 않습니다.

+0

위젯이 아닌 대화 상자가 필요한 이유가 있습니까? – Hayt

+0

@Hayt, 거기에 QTreeView를 표시하고 싶기 때문에 별도의 창이 필요합니다. – Pavel

+0

대화 상자가 아닌 사용자 정의 위젯을 작성하십시오. 당신은 위젯을 당신의 델리게이트에 집어 넣을 수 있습니다. – Hayt

답변

4

편집기 위임자는보기에 포함 된 위젯이어야합니다. 원한다면 최상위 창을 자유롭게 만들 수 있지만 해당 창의 가시성과 초점을 적절하게 제어해야합니다. 즉, 편집기 위젯의 가시성이 변경되면 대화 상자도 변경되어야하며 편집기 위젯이 포커스를 얻으면 중요한 UX 용 대화 상자로 포커스를 이동해야합니다.

QWidget * MyDelegate::createEditor(QWidget * parent, 
        const QStyleOptionViewItem &, const QModelIndex & index) const 
{ 
    auto editor = new QWidget{parent}; 
    auto dialog = new QDialog{editor, Qt::Window}; 
    ... 
    return editor; 
} 

작동하지 않았다 당신의 QDialog -editor은 기하학과 상태가되었다 있다는 것입니다 이유 :

이 솔루션은 톱 레벨의 윈도우이며, 아이 QDialog이있는 빈 QWidget을하는 것입니다 보기에 의해 관리됩니다. 뷰는 편집자/위임자를위한 레이아웃처럼 작동합니다. 이러한 조작으로부터 대화 상자를 보호하기 위해 중간 위젯을 삽입해야합니다. 틀림없이, 뷰는 에디터의 플래그를 검사하고 Qt::Window 플래그가 설정되어 있다면 형상 등을 조정하는 것을 삼가 할 수는 있지만 매우 희귀하기 때문에 구현하지 않는 사람을 비난하지는 않습니다. 물론 Qt에 대한 변경을 제출할 수 있습니다!

+0

답변 주셔서 감사합니다.하지만 메인 윈도우의 QModelIndex를 두 번 클릭하면 QDialog가 열립니 까? – Pavel

+0

오, 아마 당신은 대화 상자를 구성원으로 가지고 있고 그것의 생성자에서 exec를 호출하는 커스텀 QWidget을 생성해야한다는 것을 의미했을까요? – Pavel

+0

@Pavel 당신은 맞춤 위젯에 대해 옳았습니다. 또한'exec()'가 아닌'show()'를 사용하십시오. 일반적으로 QDialog :: exec()는 코드가 의사 동기로 보이게하기 때문에 나쁜 생각입니다. 반면 현실 세계는 아닙니다. –

1

위임자의 메소드는 인라인 편집기 용이며 뷰 내부에 표시되는 위젯입니다.

extern 편집기를 사용하려는 경우보기의 신호에만 반응하는 것이 좋습니다. clicked()을 클릭하고 해당 슬롯에서 대화 상자를 엽니 다.

+0

인라인 편집기에 대한 정보는 어디에 있습니까? 참조 할 수 있을까요? – Pavel

+0

Qt의 모델/뷰 아키텍처에서 위임 컨셉의 일부입니다. 대리자는 "모델의 데이터 항목을 표시하고 편집하는 데 사용됩니다." 델리게이트는 각 QModelIndex에 의해 참조되는 단일 셀을 처리하기 위해 뷰에서 사용됩니다. 편집기는 셀의 일반적인 시각화 대신 디스플레이로 표시되는 위젯입니다. 디스플레이 대신 입력을 용이하게하기 위해 –

+0

감사합니다. 음, 신호 및 슬롯과 함께 작동하도록 만들었지 만, 어떻게 만드는지보고 싶었습니다. 그것은 다른 모든 편집자와 같이 작동합니다. – Pavel

관련 문제