How to create columns in a QML ListView/ko
English "French":http://qt-devnet.developpez.com/tutoriels/qt-quick/qml/creation-colonnes-dans-listview/ 日本語 Български 한국어
QML ListView 에서 고정폭 열(Columns) 만들기
열(Column)의 데이터 사이즈에 따라 고정폭을 갖는 열들로 구성된 리스트뷰 만드는 방법중 하나를 소개합니다.
일반적으로 행(Row) 요소(elements)로서 구성된 리스트 뷰는 다음과 같은 형태를 가지고 있습니다.
열(Column)들은 행(Row) 요소(element)들의 너비가 설정되면서 만들어 집니다.
문자열 너비값 받아오기
QML에서는 폰트 매트릭스(Font metrics)가 존재하지 않습니다. 따라서 "텍스트Text element":http://developer.qt.nokia.com/doc/qt-4.7/qml-text.html 는 자바스크립트를 동적으로 생성하여 문자열의 너비를 계산할 수 있습니다.
<br /> // 임시 Text element 만들기<br /> var textElement = Qt.createQmlObject('import Qt 4.7; Text { text: "' + text + '"}',<br /> parent, "calcTextWidth");
// 'textElement.width' 를 통하여 문자열 너비값 사용하기
// 임시 element값 삭제하기<br /> textElement.destroy()<br />
리스트뷰에서 열(Columns) 생성
열(Column) 너비는 자바스크립트를 이용하여 계산되어지고, 키값을 가진 맵(map)에 저장되어 지며, 리스트뷰 대리자(delegate)를 통하여 사용할 수 있다.
main.qml
리스트뷰의 간단한 데모 UI입니다. 사각형(Rectangle) 요소(element)는 컨테이너로 사용되고 있고, 각행에 표시하는 것과 동일한 컬러를 표시하고 있습니다. columnWidths property 가 대리자(delegate)에서 사용되는 열너비(ColumnWidths) 를 저장하고 있습니다.
<br />import Qt 4.7<br />import "ColumnHelper.js" as ColumnHelper
Rectangle {<br /> width: 620<br /> height: 200<br /> color: "#bebebe"
ListView {<br /> id: list<br /> property variant columnWidths: ColumnHelper.calcColumnWidths(model, list)<br /> anchors.fill: parent<br /> model: MovieModel { }<br /> delegate: MovieItem { }<br /> }
}<br />
ColumnHelper.js
모든 열(Column)의 데이타에 걸쳐서 최대너비 값을 계산해 내는 간단한 자바 스크립트 함수입니다. 계산된 결과 값은 리턴된 열이름(Column name)을 키로 하여 저장됩니다.
<br />var columns = {}
function calcColumnWidths(model, parent)<br />{<br /> for (var i = 0; i < model.count; +''i)<br /> {<br /> var data = model.get(i)<br /> for (var key in data)<br /> {<br /> if (!columns[key]) {<br /> columns[key] = 0<br /> }
<br /> var textElement = Qt.createQmlObject(<br /> 'import Qt 4.7;'<br />'' 'Text {'<br /> + ' text: "' + data[key] + '" '<br /> + '}',<br /> parent, "calcColumnWidths")
columns[key] = Math.max(textElement.width, columns[key])<br /> textElement.destroy()<br /> }<br /> }<br /> return columns<br />}<br />
MovieItem.qml
리스트뷰의 대리자(delegate)입니다. 리스트의 columnWidths property를 사용하여 각 열의 너비를 설정합니다.
<br />import Qt 4.7
Component {<br /> Item {<br /> id: item<br /> width: parent.width - 15<br /> height: row.height
function altColor(i) {<br /> var colors = [ "#bebebe", "#b7b7b7" ];<br /> return colors[i];<br /> }
Rectangle {<br /> id: background<br /> width: parent.width + 15<br /> height: parent.height<br /> color: altColor(index%2)<br /> }
Row {<br /> id: row<br /> width: parent.width<br /> spacing: 5<br /> Item {<br /> // Indent a little<br /> width: 5<br /> height: 1<br /> }<br /> Text {<br /> width: list.columnWidths['title']<br /> text: model.title<br /> color: "blue"<br /> }<br /> Loader { sourceComponent: columnSeparator; height: parent.height }<br /> Text {<br /> width: list.columnWidths['year']<br /> text: model.year<br /> }<br /> Loader { sourceComponent: columnSeparator; height: parent.height }<br /> Text {<br /> width: list.columnWidths['rank']<br /> text: model.rank<br /> }<br /> Loader { sourceComponent: columnSeparator; height: parent.height }<br /> Text {<br /> width: list.columnWidths['votes']<br /> text: model.votes<br /> }<br /> Loader { sourceComponent: columnSeparator; height: parent.height }<br /> Text {<br /> width: list.columnWidths['composer']<br /> text: model.composer ? model.composer : ""<br /> }
Component {<br /> id: columnSeparator<br /> Rectangle {<br /> width: 1<br /> color: "black"<br /> opacity: 0.3<br /> }<br /> }<br /> }<br /> }<br />}<br />
MovieModel.qml
인터넷 무비 데이터베이스 ( http://www.imdb.com ) 에서 얻은 정보를 모델로 한 것입니다.
<br />import Qt 4.7
ListModel {<br /> ListElement {<br /> votes: 532564<br /> rank: 9.2<br /> title: "The Shawshank Redemption"<br /> year: 1994<br /> composer: "Newman, Thomas"<br /> }<br /> ListElement {<br /> votes: 419312<br /> rank: 9.1<br /> title: "The Godfather"<br /> year: 1972<br /> composer: "Rota, Nino"<br /> }<br /> ListElement {<br /> votes: 251290<br /> rank: 9.0<br /> title: "The Godfather: Part II"<br /> year: 1974<br /> composer: "Rota, Nino"<br /> }<br /> ListElement {<br /> votes: 225000<br /> rank: 8.9<br /> title: "Inception"<br /> year: 2010<br /> composer: "Zimmer, Hans"<br /> }<br /> ListElement {<br /> votes: 165033<br /> rank: 8.9<br /> title: "Il buono, il brutto, il cattivo."<br /> year: 1966<br /> composer: "Morricone, Ennio"<br /> }<br /> ListElement {<br /> votes: 426752<br /> rank: 8.9<br /> title: "Pulp Fiction"<br /> year: 1994<br /> }<br /> ListElement {<br /> votes: 282473<br /> rank: 8.9<br /> title: "Schindler's List"<br /> year: 1993<br /> composer: "Williams, John"<br /> }<br /> ListElement {<br /> votes: 122919<br /> rank: 8.9<br /> title: "12 Angry Men"<br /> year: 1957<br /> composer: "Hopkins, Kenyon"<br /> }<br /> ListElement {<br /> votes: 219739<br /> rank: 8.8<br /> title: "One Flew Over the Cuckoo's Nest"<br /> year: 1975<br /> composer: "Nitzsche, Jack"<br /> }<br /> ListElement {<br /> votes: 476112<br /> rank: 8.8<br /> title: "The Dark Knight"<br /> year: 2008<br /> composer: "Zimmer, Hans"<br /> }<br /> ListElement {<br /> votes: 283354<br /> rank: 8.8<br /> title: "Star Wars: Episode V - The Empire Strikes Back"<br /> year: 1980<br /> composer: "Williams, John"<br /> }<br /> ListElement {<br /> votes: 371790<br /> rank: 8.8<br /> title: "The Lord of the Rings: The Return of the King"<br /> year: 2003<br /> composer: "Shore, Howard"<br /> }<br /> ListElement {<br /> votes: 98799<br /> rank: 8.8<br /> title: "Shichinin no samurai"<br /> year: 1954<br /> composer: "Hayasaka, Fumio"<br /> }<br /> ListElement {<br /> votes: 326619<br /> rank: 8.7<br /> title: "Star Wars"<br /> year: 1977<br /> composer: "Williams, John"<br /> }<br /> ListElement {<br /> votes: 234582<br /> rank: 8.7<br /> title: "Goodfellas"<br /> year: 1990<br /> }<br /> ListElement {<br /> votes: 170874<br /> rank: 8.7<br /> title: "Casablanca"<br /> year: 1942<br /> composer: "Steiner, Max"<br /> }<br />}<br />