QML:使用 ListView.OverlayFooter 时页脚中的按钮无响应

Posted

技术标签:

【中文标题】QML:使用 ListView.OverlayFooter 时页脚中的按钮无响应【英文标题】:QML: Button in footer unresponsive when using ListView.OverlayFooter 【发布时间】:2020-07-16 18:20:45 【问题描述】:

编辑:该问题似乎与 Qt 5.15 相关,但与 Qt 5.14 无关!

我正在学习 QML,并制作了一个由包含 ListView 的 Window 组成的应用程序。

我正在尝试添加一个按钮,它应该位于窗口底部的固定位置(滚动时它不应该移动)。因此,我决定将这个Button添加到ListView的footer属性中,并设置footerPositioning: ListView.OverlayFooter

但是,这样做会使按钮完全没有响应。 如果我注释掉 footerPositioning 行,按钮会按预期工作,但位置错误。

文档指出“如果 footerPositioning 未设置为 ListView.InlineFooter,则用户无法从页脚按下并轻弹列表。在任何情况下,页脚项目可能包含提供自定义处理的项目或事件处理程序鼠标或触摸输入" ;对我来说,这并不是说项目(这里是按钮)事件处理不应该工作。

这是一个显示无响应按钮行为的代码示例:

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();


如何在保持 ListView.OverlayFooter 的同时使按钮响应?

【问题讨论】:

我已经测试了您的代码 - 它似乎工作正常。单击时,按钮的颜色会从 gray 变为 green 换色是唯一的预期动作。我创建了一个新项目并再次粘贴了我的代码,问题仍然存在。什么可能导致我们的行为不同?我在调试配置中使用带有 Qt 5.15 的 MSVC2019 64 位 这很有趣。我正在使用 MinGW 7.3 和 Qt 5.14 进行测试,它工作正常。但是,对于 MSVC2019 和 Qt 5.15,它也不适用于我。 有这样一个bug报告:bugreports.qt.io/browse/QTBUG-85302也许你会觉得很有趣。 感谢错误报告,这正是我的问题!当您的问题实际上是错误时,应遵循什么行为? 【参考方案1】:

Thomenson 指出,此问题与错误有关。在 Qt 5.15 中,使用启用了剪辑且 ListView.OverlayFooter 的 ListView 似乎会禁用页脚中的鼠标事件处理。

从 Qt 5.15 切换到 Qt 5.14 解决了这个问题。

相关问题的 bugtracker 可以在这里找到:bugreports.qt.io/browse/QTBUG-85302

【讨论】:

【参考方案2】:

在修复QTBUG-85302 之前,我们无法降级,解决方法是为ListView 设置clip: false,为父容器项设置clip: trueRectangleItem,它们的大小相同。

【讨论】:

以上是关于QML:使用 ListView.OverlayFooter 时页脚中的按钮无响应的主要内容,如果未能解决你的问题,请参考以下文章

基于qml创建最简单的图像处理程序-使用c++&qml进行图像处理

如何在 Cascades、Blackberry 10 中使用 Qt/QML/C++ 从另一个 qml 文件中更改一个 qml 文件中的标签文本?

如何使用 .qml 页面设置容器内容?

无法在 Loader QML 文件中保存 QML 对象

pyqt5 孩子使用 qml 文件访问

从另一个 QML 文件打开新的 QML 文件