1

私のプロジェクトにあるのは、構造要素のリストを含むバイナリファイルです。

typedef struct {
    unsigned int   id;
    char           name[SIZE];
} Entry;

ファイルからデータを読み取った後、すべての読み取り値をクラスの次のフィールドに格納します。

QVector<Entry> entires;

私はこのリストを次の宣言でQMLに公開します:

Q_PROPERTY(QVector<Entry> FileContents READ getEntries NOTIFY TmpFileUpdated)

その後にgetterメソッドとsetterメソッドが続きます。

inline QVector<Entry> getEntries () 
{ 
    return this->entires; 
}

inline void setEntries(QVector<entires> entries) 
{ 
    this->entires= entries; 
    emit TmpFileUpdated(); 
}

ファイルが読み取られるたびに、「setEntries」メソッドを使用してベクトルを設定し、信号を送信します。

QMLのリストビューには、モデルに添付されたQ_PROPERTYFileContentsがあります。

ListView {
    id: myListView
    width: 200
    height: 400

    model: myInjectedObject.FileContents

    delegate: Row {
        spacing: 10         
        Text {
            text: model.entry_type // (1)
            font.pixelSize: 12
            horizontalAlignment: "AlignHCenter"
            verticalAlignment: "AlignVCenter"
            height: 20
        }
    }
}

構造のリストに保持されているデータにアクセスしてQMLで表示するにはどうすればよいですか?

更新: あなたの提案の後、私はコードを少し変更しました、そしてそれは今うまくコンパイルされます。次のクラスが作成されました。

class EntryClass: QObject
{
    Q_OBJECT
    Q_PROPERTY(QString entry_name READ getEntryName)
public:
    inline EntryClass(Entry entrystruct)
    {
        this->entry = entrystruct;
    }
private:
    Entry entry;

    inline QString getEntryName() const
    {
        return this->entry->entry_name;
    }    
};

ListView {
    id: myListView
    width: 200
    height: 400

    model: myInjectedObject.FileContents

    delegate: Row {
        spacing: 10       
        Text {
            text: modelData.entry_name // (1)
            font.pixelSize: 12
            horizontalAlignment: "AlignHCenter"
            verticalAlignment: "AlignVCenter"
            height: 20
        }
    }
}

UPDATE 2 OK、もう少し分析した後、私はうまくいく解決策を見つけることができました。上記のListView宣言に関しては、現在の状態に更新されました(参照による構造体の受け渡しは機能しませんでした。値によるコピーを使用する必要がありました)。

どちらの答えも何らかの形で役に立ちましたが、受け入れることができるのは1つだけなので、ラドンが書いた最初の答えを受け入れます。指導ありがとうございました!

4

2 に答える 2

4

QMLは「低レベル」structタイプにアクセスできません。

ただし、 QtプロパティとしてEntryClass継承および追加するクラスを作成QObjectできます(内部的には、対応する構造体インスタンスのデータを使用できます。たとえば、ポインターを使用します)。そうすれば、QMLでこれらのプロパティにアクセスできるようになります。idnameEntryClassEntry

(しかし、私はそれをテストしませんでした)

于 2011-11-02T20:05:23.330 に答える
0

ラドンは正しいです。QMLにエクスポートされたオブジェクトにはプロパティ(またはQ_INVOKABLE関数)が必要です。

さらに、QVectorも機能しません。プロパティタイプとしてQDeclarativeListPropertyまたはQVariantListを使用する必要があります。

于 2011-11-02T22:33:28.910 に答える