2 votes

QML : le bouton du pied de page ne répond pas lorsque l'on utilise ListView.OverlayFooter

EDIT : Le problème semble être lié à Qt 5.15 et ne se manifeste pas avec Qt 5.14 !

J'apprends le langage QML et j'ai créé une application composée d'une fenêtre contenant un ListView.

J'essaie d'ajouter un bouton, qui doit se trouver à une position fixe en bas de la fenêtre (il ne doit pas bouger lorsque je fais défiler la page). J'ai donc décidé d'ajouter ce bouton à l'attribut footer de la ListView, et de définir footerPositioning : ListView.OverlayFooter

Cependant, si vous le faites, le bouton ne répondra plus du tout. Si je commente la ligne footerPositioning, le bouton fonctionne comme prévu, mais il est mal placé.

La documentation indique que " Si footerPositioning n'est pas défini sur ListView.InlineFooter, l'utilisateur ne peut pas appuyer sur la liste et la feuilleter à partir du pied de page. Dans tous les cas, l'élément de pied de page peut contenir des éléments ou des gestionnaires d'événements qui permettent une gestion personnalisée de la souris ou des entrées tactiles. "Ce qui, selon moi, ne veut pas dire que la gestion de l'événement de l'élément (ici un bouton) ne devrait pas fonctionner.

Voici un exemple de code qui montre le comportement du bouton non réactif :

Debug.qml

import QtQuick 2.9
import QtQuick.Window 2.9
import QtQuick.Layouts 1.9
import QtQuick.Controls 2.9

Window {

    visible: true
    width: 260
    height: 520

    ListView {
        anchors.fill: parent
        clip: true
        spacing: 6
        model: 4

        delegate: RowLayout {
            width: parent.width
            Rectangle {
                Layout.fillWidth: true
                height: 60
                color: "#ff0000"
            }
        }

        footerPositioning: ListView.OverlayFooter // comment out this line to make the button responsive
        footer: Button {
            height: 180
            width: 90
            background: Rectangle {
                id: backbtn
                color: "gray"
            }

            onClicked: {
                backbtn.color = "#00ff00"
            }
        }
    }
}

main.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>

int main(int argc, char *argv[])
{
#if defined(Q_OS_WIN)
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
#endif

    QGuiApplication app(argc, argv);
    QQmlApplicationEngine engine;

    engine.load(QUrl(QStringLiteral("qrc:/Debug.qml")));

    if (engine.rootObjects().isEmpty()) {
        return -1;
    }

    return app.exec();
}

Comment puis-je rendre le bouton réactif tout en conservant ListView.OverlayFooter ?

3voto

now Points 51

Ce problème est lié à un bogue, tel qu'identifié par Thomenson. Dans Qt 5.15, l'utilisation d'une ListView avec le clip activé et ListView.OverlayFooter semble désactiver la gestion des événements de souris dans le pied de page.

Le passage de Qt 5.15 à Qt 5.14 résout le problème.

Le bugtracker du problème en question peut être trouvé ici : rapports de bogue.qt.io/browse/QTBUG-85302

0voto

Nous ne pouvons pas rétrograder tant que QTBUG-85302 est fixé, la solution de contournement consiste à définir clip: false pour le ListView y clip: true pour l'élément du conteneur parent : Rectangle o Item qui a la même taille.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X