2010-12-22 7 views
5

ListStore가있는 TreeView를 모델로 사용하고 있습니다. 사용자가 행을 클릭하면 셀의 값을 사용하지 않고 셀에서 값을 사용하지만 행을 만든 데이터를 사용합니다 ...GtkTreeView를 올바르게 사용하는 방법

현재 TreeView, TreeModel (ListStore) 및 내 자신의 데이터 (나는 아이러니하게도 모델 부른다) ..

그래서 질문은 다음과 같습니다

이 모델이에게 "오른쪽"인가 - 나는 표시하고있는 ListStore을 채우려는 데이터의 객체 표현을 그 데이터를 TreeView에 표시하거나, 데이터를 표시하기 위해 자체 데이터 모델을 래핑하는 TreeModel의 자체 버전을 구현하는 것이 더 좋을까요?

또한 :

만약 행에있는 사람을 두 번 클릭 내가 얻을 수있는 RowActivated 이벤트 (사용의 C# /은 Gtk #) 활성화 된 행에 대한 경로를 제공합니다. 이를 통해 TreeIter를 얻을 수 있으며이를 사용하여 셀의 가치를 얻을 수 있습니다. 하지만 행이 처음부터 생성 된 데이터 객체를 찾는 가장 좋은 방법은 무엇입니까? \ (어떻게 든이 질문은 첫 번째 질문에 대한 것입니다. 생각하면 데이터 객체를 더 쉽게 얻을 수 있습니다. 자신의 TreeModel ...)

답변

7

TreeModel을 구현하는 것이 어렵거나 어렵 기 때문에 대부분의 사람들은 단순히 "실제"모델의 데이터를 TreeStore 또는 ListStore에 동기화합니다.

저장소의 열은 어떤 식 으로든보기의 열과 일치하지 않아도됩니다. 예를 들어, 실제 관리 데이터 객체가 포함 된 열을 가질 수 있습니다.

TreeView (시각적) 열에 cellrenderer를 추가하면 해당 속성과 저장소 열 사이에 매핑을 추가 할 수 있습니다. 예를 들어, 한 store 열을 텍스트 cellrenderer의 글꼴에 매핑하고 다른 store 열을 동일한 cellrenderer의 text 속성에 매핑 할 수 있습니다. cellrenderer를 사용하여 특정 셀을 렌더링 할 때마다 매핑을 사용하여 저장소에서 값을 검색하고 렌더링하기 전에 렌더러의 속성에 적용합니다.

여기 매핑의 예 다음 editable 속성에 렌더러의 text GTK 속성과지도 가게 열 4

treeView.AppendColumn ("Title", renderer, "text", 0, "editable", 4); 

이지도를 저장 열 0. GTK 속성 이름의 경우 GTK docs을 확인할 수 있습니다. 위의 예제는 컬럼을 추가하고 렌더러를 추가하고 params를 통해 임의의 매핑 수를 추가하는 편리한 메소드를 사용합니다. 여러 렌더러가있는 열과 같이 열에 직접 매핑을 추가하려면 렌더러를 열에 포장 한 다음 TreeViewColumn.AddAttribute 또는 TreeViewColumn.SetAttributes을 사용합니다.

매핑 대신 사용할 사용자 지정 데이터 함수를 설정할 수도 있습니다. 이렇게하면 TreeIter와 저장소가 주어지면 렌더러의 속성을 직접 설정할 수 있습니다. 표시하려는 모든 데이터가 실제 데이터 객체에서 쉽게 파생되면 저장소에 단일 열만 포함될 수도 있습니다. 이러한 객체를 사용하고 모든 뷰 열에 데이터 함수를 사용합니다.,

treeColumn.SetCellDataFunc (renderer, delegate (TreeViewColumn col, 
    CellRenderer cell, TreeModel model, TreeIter iter) 
{ 
    var textCell = (CellRendererText) cell; 
    textCell.Text = (string) model.GetValue (iter, 0); 
    textCell.Editable = (bool) model.GetValue (iter, 4); 
}); 

은 물론 데이터 기능이 훨씬 그들은 당신이뿐만 아니라 더 복잡한 GTK 객체의 속성을 사용 할 수 있기 때문에 더 강력 :

여기에 매핑 예를 들어 위의 않습니다 정확히 무엇 데이터 FUNC의 예 예를 들어 셀이 실제로 렌더링 될 때만 파생 값을 지연 처리하는 등보다 복잡한 표시 논리를 구현할 수도 있습니다.

+0

정보를 주셔서 감사합니다. 이제 ListData를 정확하게 수정하여 SetCellDataFunc를 통해 CellRenderer를 설정합니다. store 속성과 cellRenderer 속성 사이의 "매핑"사용에 대해 자세히 설명해 주시겠습니까? – Nils

+0

OK, 몇 가지 예를 추가했습니다 :) –

+0

감사합니다. – Nils

관련 문제