2014-10-23 2 views
2

Я пытаюсь сделать пользовательский компонент для редактирования таблиц в QML, как это:Как распространять TableViewColumn список для дочернего TableView?

// BaseTableView.qml 
import QtQuick 2.3 
import QtQuick.Controls 1.2 

Item { 
    signal addActionPerformed() 
    signal editActionPerformed(int id) 
    signal deleteActionPerformed(int id) 

    property var model 

    ToolBar { 
     id: toolBar 
     anchors.left: parent.left 
     anchors.right: parent.right 

     Row { 
      ToolButton { 
       id: addButton 
       iconSource: "qrc:/icons/actions/add.png" 
       onClicked: addActionPerformed() 
      } 

      ToolButton { 
       id: editButton 
       enabled: false 
       iconSource: "qrc:/icons/actions/edit.png" 
      } 

      ToolButton { 
       id: deleteButton 
       enabled: false 
       iconSource: "qrc:/icons/actions/delete.png" 
      } 
     } 
    } 

    TableView { 
     id: tableView 
     model: parent.model 
     anchors.left: parent.left 
     anchors.right: parent.right 
     anchors.top: toolBar.bottom 
     anchors.bottom: parent.bottom 

     onCurrentRowChanged: { 
      editButton.enabled = currentRow !== null 
      deleteButton.enabled = currentRow !== null 
     } 
    } 
} 

и использовать этот компонент в другой файл, например так:

// Another.qml file 
import QtQuick 2.3 
import QtQuick.Controls 1.2 

import "../common" // Here is BaseTableView.qml 

BaseTableView { 

    TableViewColumn { 
     role: "id" 
     title: qsTr("Id") 
    } 

    TableViewColumn { 
     role: "object_expression" 
     title: qsTr("Expression") 
    } 
} 

Таким образом, проблема заключается в том, как я могу таблицы столбцов таблицы столбцов от использования до основного TableView? Я попытался создать список свойств в BaseTableView и присвоить список объектов этому свойству в Aother.qml? но безуспешно.

ответ

3

Использование default properties:

Определение объекта может иметь одно свойство по умолчанию. Свойством default является свойство, которому присваивается значение, если объект объявлен в определении другого объекта без объявления его как значения для определенного свойства.

Большее значение для сценария:

Вы заметите, что дочерние объекты могут быть добавлены к любому элементу на основе типа без явного добавления их в собственность детей. Это связано с тем, что свойство по умолчанию элемента Item является свойством данных, а любые элементы, добавленные в этот список для элемента, автоматически добавляются в его список дочерних элементов. Свойства по умолчанию могут быть полезны для переназначения детей элемента. См. Пример TabWidget, который использует свойство по умолчанию для автоматического переназначения дочерних элементов TabWidget как дочерних элементов внутреннего ListView.

Если вы посмотрите на TabWidget example, что последний пункт относится к, вы должны иметь все, что вам нужно:

import QtQuick 2.0 

Item { 
    id: tabWidget 

    // Setting the default property to stack.children means any child items 
    // of the TabWidget are actually added to the 'stack' item's children. 
    // See the "Property Binding" 
    // documentation for details on default properties. 
    default property alias content: stack.children 

    property int current: 0 

    onCurrentChanged: setOpacities() 
    Component.onCompleted: setOpacities() 

    function setOpacities() { 
     for (var i = 0; i < stack.children.length; ++i) { 
      stack.children[i].opacity = (i == current ? 1 : 0) 
     } 
    } 

    Row { 
     id: header 

     Repeater { 
      model: stack.children.length 
      delegate: Rectangle { 
       width: tabWidget.width/stack.children.length; height: 36 

       Rectangle { 
        width: parent.width; height: 1 
        anchors { bottom: parent.bottom; bottomMargin: 1 } 
        color: "#acb2c2" 
       } 
       BorderImage { 
        anchors { fill: parent; leftMargin: 2; topMargin: 5; rightMargin: 1 } 
        border { left: 7; right: 7 } 
        source: "tab.png" 
        visible: tabWidget.current == index 
       } 
       Text { 
        horizontalAlignment: Qt.AlignHCenter; verticalAlignment: Qt.AlignVCenter 
        anchors.fill: parent 
        text: stack.children[index].title 
        elide: Text.ElideRight 
        font.bold: tabWidget.current == index 
       } 
       MouseArea { 
        anchors.fill: parent 
        onClicked: tabWidget.current = index 
       } 
      } 
     } 
    } 

    Item { 
     id: stack 
     width: tabWidget.width 
     anchors.top: header.bottom; anchors.bottom: tabWidget.bottom 
    } 
} 

В подобных случаях, когда вы хотите, чтобы повторить то, что делается с помощью пункт, предлагаемый Qt, также может быть полезно взглянуть на source code of what you're trying to replicate. Однако документацию немного легче читать. :)

+0

Большое спасибо ... Работает с "содержимым псевдонима свойства default: tableView.data" – Anton

Смежные вопросы