QML ListView.count返回0,但在其中可以看到代理(图像)

QML ListView.count返回0,但在其中可以看到代理(图像),listview,qml,Listview,Qml,我有以下QMLListView: ListView { antialiasing: true Layout.alignment: Qt.AlignCenter Layout.fillWidth: true Layout.preferredHeight: 128 clip: true spacing: 64 model: uePeopleModel orientation: ListView.Horizontal

我有以下QML
ListView

ListView
{
    antialiasing: true
    Layout.alignment: Qt.AlignCenter
    Layout.fillWidth: true

    Layout.preferredHeight: 128

    clip: true

    spacing: 64

    model: uePeopleModel

    orientation: ListView.Horizontal

    highlightFollowsCurrentItem: true

    delegate: Image
    {
        source: "image://uePeopleModel/"+model.ueRoleImage

        scale: parent.ListView.isCurrentItem ? 1.5 : 1

        Behavior on scale
        {
            NumberAnimation
            {
                duration: 200
            }   // NumberAnimation
        }   // Behavior
    }   // delegate

    preferredHighlightBegin: width/2
    preferredHighlightEnd: width /2
    highlightRangeMode: ListView.StrictlyEnforceRange
    Component.onCompleted:
    {
        currentIndex=count/2
        print("ListView.count: "+count)
        print("ListView.currentIndex: "+currentIndex)
        print("ListView.currentItem: "+currentItem)
    }   // Component.onCompleted
}   // ListView
        ListView
        {
            id: ueUserInfoListView

            antialiasing: true
            Layout.alignment: Qt.AlignCenter
            Layout.fillWidth: true

            Layout.preferredHeight: 128

            clip: true

            spacing: 64

            model: uePeopleModel

            orientation: ListView.Horizontal

            highlightFollowsCurrentItem: false

            delegate: Image
            {
                id: ueUserInfoListViewDelegate

                source: "image://uePeopleModel/"+model.ueRoleImage

                function ueDoOpacity()
                {
                    if(ueUserInfoListViewDelegate===currentItem)
                        opacity=1.0
                    else
                        opacity=0.3
                }

                Behavior on opacity
                {
                    NumberAnimation
                    {
                        duration: 1000
                    }   // NumberAnimation
                }   // Behavior

                Component.onCompleted:
                {
                    ueUserInfoListViewDelegate.focusChanged.connect(ueDoOpacity)
                }   // Component.onCompleted
            }   // delegate

            Component.onCompleted:
            {
                preferredHighlightBegin=width/2
                preferredHighlightEnd=width /2
                highlightRangeMode=ListView.StrictlyEnforceRange
                currentIndex=count/2
            }   // Component.onCompleted
        }   // ListView
现在,当我运行应用程序时,项目(图像)会显示在ListView中,但调试
打印
语句报告:

qml:ListView.count:0 qml:ListView.currentIndex:0 qml: ListView.currentItem:null

因此,我无法获得“中心项目”。为什么?并且项目也不会根据
ListView
的语句
scale:parent.ListView.iscurrentem进行缩放?1.5:1
,为什么

Here is coresponding model header file:
#ifndef UEPEOPLEMODEL_H
#define UEPEOPLEMODEL_H

#include <QImage>
#include <QVariant>
#include <QStringList>
#include <QHash>
#include <QByteArray>
#include <QSqlError>
#include <QSqlQueryModel>
#include <QSqlRecord>
#include <QModelIndex>
#include <QQuickImageProvider>
#include <QByteArray>
#include <QSqlRecord>
#include <QSqlQuery>

#include "../settings/uedefaults.h"
#include "../core/uedatabaseconnectionstatus.h"
#include "../core/uetypes.h"
#include "../core/ueapplicationstatus.h"
#include "../core/ueuserrecord.h"

class UePeopleModel : public QSqlQueryModel,
                      public QQuickImageProvider
{
    Q_OBJECT

private:
    QSqlDatabase m_ueDb;

private:
    QSqlDatabase ueDatabase() const
        { return this->m_ueDb; }
    void ueSetDatabase(const QSqlDatabase& database)
        { this->m_ueDb=database; }
    QImage ueImage(const QString& id) const;

public:
    UePeopleModel(QObject *parent=0);
    ~UePeopleModel();

    QVariant data(const QModelIndex &index,
                  int role) const Q_DECL_OVERRIDE;
    QImage requestImage(const QString &id,
                        QSize *size,
                        const QSize &requestedSize);
    UeTypeRoles roleNames() const;
    void ueConnectToDatabase();
    UeTypeUsers* ueFetchUsers();

public:
    static const int ueRoleName=Qt::UserRole+1;
    static const int ueRoleImage=Qt::UserRole+2;
    static const int ueRolePassword=Qt::UserRole+3;

signals:
    void ueSignalDatabaseConnectionChanged(const UeDatabaseConnectionStatus::UeTypeDatabaseConnectionStatus& newStatus);
};

#endif // UEPEOPLEMODEL_H
我还添加了
print(parent.ListView.currentIndex)
内部函数
ueDoOpacity
在项目开始时,我得到:

qml:未定义

如果向左/向右滚动ListView的项,则不会再次调用该函数。为什么

我已经将目标属性
比例
替换为
不透明度
,这里升级了
列表视图

ListView
{
    antialiasing: true
    Layout.alignment: Qt.AlignCenter
    Layout.fillWidth: true

    Layout.preferredHeight: 128

    clip: true

    spacing: 64

    model: uePeopleModel

    orientation: ListView.Horizontal

    highlightFollowsCurrentItem: true

    delegate: Image
    {
        source: "image://uePeopleModel/"+model.ueRoleImage

        scale: parent.ListView.isCurrentItem ? 1.5 : 1

        Behavior on scale
        {
            NumberAnimation
            {
                duration: 200
            }   // NumberAnimation
        }   // Behavior
    }   // delegate

    preferredHighlightBegin: width/2
    preferredHighlightEnd: width /2
    highlightRangeMode: ListView.StrictlyEnforceRange
    Component.onCompleted:
    {
        currentIndex=count/2
        print("ListView.count: "+count)
        print("ListView.currentIndex: "+currentIndex)
        print("ListView.currentItem: "+currentItem)
    }   // Component.onCompleted
}   // ListView
        ListView
        {
            id: ueUserInfoListView

            antialiasing: true
            Layout.alignment: Qt.AlignCenter
            Layout.fillWidth: true

            Layout.preferredHeight: 128

            clip: true

            spacing: 64

            model: uePeopleModel

            orientation: ListView.Horizontal

            highlightFollowsCurrentItem: false

            delegate: Image
            {
                id: ueUserInfoListViewDelegate

                source: "image://uePeopleModel/"+model.ueRoleImage

                function ueDoOpacity()
                {
                    if(ueUserInfoListViewDelegate===currentItem)
                        opacity=1.0
                    else
                        opacity=0.3
                }

                Behavior on opacity
                {
                    NumberAnimation
                    {
                        duration: 1000
                    }   // NumberAnimation
                }   // Behavior

                Component.onCompleted:
                {
                    ueUserInfoListViewDelegate.focusChanged.connect(ueDoOpacity)
                }   // Component.onCompleted
            }   // delegate

            Component.onCompleted:
            {
                preferredHighlightBegin=width/2
                preferredHighlightEnd=width /2
                highlightRangeMode=ListView.StrictlyEnforceRange
                currentIndex=count/2
            }   // Component.onCompleted
        }   // ListView

我不知道为什么您的刻度没有改变,一个解决方法是创建一个函数刻度并将其连接到focusChanged信号,请尝试以下示例:

import QtQuick 2.0 
import QtQuick.Layouts 1.2
ListView
{
    id:idList
    antialiasing: true
    Layout.alignment: Qt.AlignCenter
    Layout.fillWidth: true
    width:200
    height:200
    Layout.preferredHeight: 128

    clip: true

    spacing: 10

    model: 3

    orientation: ListView.Horizontal

    highlightFollowsCurrentItem: true

    delegate: Rectangle
    {
    id:obj
    // source: "image://uePeopleModel/"+model.ueRoleImage
    color:"yellow"
    width:30
    height:30

    function doScale()
    {
        if(obj === idList.currentItem)
            obj.scale = 1.5
        else
            obj.scale = 1.0
    }
    //scale: parent.ListView.isCurrentItem ? 1.5 : 1
    Component.onCompleted:
    {
        obj.focusChanged.connect(doScale)
    }
    Behavior on scale
    {
        NumberAnimation
        {
            duration: 300
        }   // NumberAnimation
    }   // Behavior
}   // delegate

preferredHighlightBegin: width/2
preferredHighlightEnd: width /2
highlightRangeMode: ListView.StrictlyEnforceRange
Component.onCompleted:
{
    currentIndex=count/2
    print("ListView.count: "+count)
    print("ListView.currentIndex: "+currentIndex)
    print("ListView.currentItem: "+currentItem)
}   // Component.onCompleted
} 

现在一切正常,只需一个细节:
ListView.count
仍然返回0,并且它没有居中!奇怪的是,我的示例中没有这种行为,它打印count=3并且居中,我在windows上使用Qt5.5.0