QML ListView.count返回0,但在其中可以看到代理(图像)
我有以下QMLQML 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
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