1

ComboBoxのモデルを初期化しようとすると変なエラーが飛び出す

テストプロ

# Add more folders to ship with the application, here
folder_01.source = qml/androidTest
folder_01.target = qml
DEPLOYMENTFOLDERS = folder_01

#QMAKE_CXXFLAGS += -std=c++0x
CONFIG   += c++11
QT += qml quick

# The .cpp file which was generated for your project. Feel free to hack it.
SOURCES += main.cpp

OTHER_FILES += \
    qml/androidTest/main.qml

main.cpp

#include <QtGui/QGuiApplication>
#include <QQuickView>

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);   

    QQuickView view;
    view.setSource(QUrl("/Users/Qt/program/experiment_apps_and_libs/test/qml/test/main.qml"));
    view.show();

    return app.exec();
}

main1.qml

import QtQuick 2.2
import QtQuick.Controls 1.1

Rectangle {
width: 100
height: 62

ListModel{
id: modelA
}

ComboBox{
model: modelA
}

Component.onCompleted: {
modelA.append({"source" : "hhhh"})
}
}

エラーメッセージ

file:///C:/Qt/Qt5.2.0/5.2.0/mingw48_32/qml/QtQuick/Controls/ComboBox.qml:496: TypeError: 未定義のプロパティ 'コンストラクター' を読み取れません

このエラーを修正するにはどうすればよいですか?

編集1:

モデルと ComboBox の構築を分離したいので、インライン モデルは作成しません。下手な英語で説明するのは難しいです。ここに簡単な例を示します。

テキストCB

Column{
    id: root    

    function appendUnitModel(units){
        for(var i = 0; i != units.length; ++i){
            unitModel.append({"unit": units[i]});
        }
    }    

    property alias inputText: input.text

    SystemPalette{id: palette}    

    ListModel{
        id: unitModel
    }

    Row{
        spacing: 5

        Text{
            id: input

            color: palette.highlight
            height: root.height / 2
            width: root.width * 0.6
            focus: true
            font.family: "Helvetica"
            font.pixelSize: 16; font.bold: true

            //Behavior on height{ NumberAnimation{duration: 500} }

            MouseArea{
                anchors.fill: parent

                onClicked: {
                    showKeyBoard()
                }
            }
        }

        ComboBox{
            id: unitSelector

            model: unitModel
            editable: true
            height: input.height
            width: root.width - input.width
        }
    }    
}

main2.qml

 TextCB{
    id: inputAndClear

    height: root.height * 0.2
    width: root.width        

    Component.onCompleted: {
        var units = ["meters", "decimeters", "centimeters",
                     "millimeters", "kilometers", "inches",
                     "feet", "yards", "miles", "nautical miles",
                     "cables"]

        inputAndClear.appendUnitModel(units)
    }

}

モデルと ComboBox の構築を分離すると、より簡単に再利用できます。

編集2:QtCreatorを使用しない人のために、ここにコマンドラインがあります

  1. /Users/yyyy/Qt5.2.0/5.2.0/clang_64/bin/qmake -makefile -d test.pro
  2. 作る
  3. cd androidTest.app/Contents/MacOS
  4. lldb テスト
  5. 走る

このコマンドは OSX で実行されます。別の OS では少し調整する必要があるかもしれません (例: lldb を gdb に変更)。

4

1 に答える 1

2

ListElement問題は、ListModel期待される「テキスト」ではなく「ソース」プロパティを設定しようとしていることです。それぞれ、次の行を変更すると:

modelA.append({"source" : "hhhh"})

に:

modelA.append({"text" : "hhhh"})

それが動作します。または、ComboBox に次の行を追加して、カスタム ロールを有効にすることもできます。

ComboBox {
    model: modelA
    textRole: "source"
}

詳細な説明については、ComboBox コードを参照してください。

// No text role set, check whether model has a suitable role
// If 'text' is found, or there's only one role, pick that.

以下に示すように、Windows の qml パスをハードコーディングするなど、コードに他の小さな問題もあります。単純に「main.qml」に変更するか、リソース システムを使用することができます。

view.setSource(QUrl("/Users/Qt/program/experiment_apps_and_libs/test/qml/test/m‌​ain.qml"));

私は個人的にローカルで単純に次のように変更しました。

view.setSource(QUrl("m‌​ain.qml"));

また、この実験には不要な qmake オプションが次のように設定されているようです。

CONFIG += c++11

QT += qml quick

後者の場合、明示的に指定する必要はありませんqml

于 2013-12-30T08:14:34.410 に答える