关于Qt ListView 内容宽度大于屏幕宽度,横向滑动解决方案

本文介绍如何在QML中将ListView组件与Flickable组件结合使用以实现流畅滚动效果。通过示例代码展示了如何设置ListView的宽度、高度及模型,同时配置Flickable的内容宽度和高度,确保在限定范围内平滑滚动。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在ListView外面包一层Flickable;
Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")
    Rectangle{id: idRect ; anchors.fill: parent
        Flickable {id: idFkb; anchors.fill: parent; boundsBehavior:Flickable.StopAtBounds;
            contentWidth: idlister.width*2; contentHeight: idlister.contentHeight;
            ListView{id: idlister;
                width: idRect.width; height: idRect.height
                model: idTestModel
                delegate: Rectangle{ width: idlister.width*2; height: 40;
                    color: "black"; border.color: "#FFFFFF";
                    Text{ anchors.centerIn: parent;
                        text: Test; font.pixelSize: 20;color: "#FFFFFF";
                    }
                    MouseArea{
                        anchors.fill: parent;
                        onClicked: {
                            console.debug(idFkb.contentWidth,idlister.contentWidth)
                        }
                    }
                }
            }
//            ScrollBar.horizontal: ScrollBar {
//                width: idFkb.width; height: 16;
//                contentItem: Rectangle {
//                    implicitWidth: idFkb.contentWidth; implicitHeight: idFkb.height;
//                    radius: height / 2; color: parent.pressed ? Qt.rgba(0,0,0,0.3) : Qt.rgba(0,0,0,0.8)
//                }
//            }
        }
        ListModel{
            id: idTestModel
            ListElement{ Test: "1" }
            ListElement{ Test: "2" }
            ListElement{ Test: "3" }
            ListElement{ Test: "4" }
            ListElement{ Test: "5" }
            ListElement{ Test: "6" }
        }
    }
}

                
Qt C++中,QListView通常用于显示数据列表,你可以通过设置其`ViewMode`为`QListView::TwoColumns`并结合自定义模型和代理器来实现横向布局。下面是一个简单的例子: 首先,你需要包含必要的头文件,并创建一个自定义模型`MyModel`,以及一个代理器`MyProxyModel`,它将负责处理数据和布局。 ```cpp #include <QApplication> #include <QListView> #include <QStandardItemModel> #include <QAbstractItemView> #include <QSortFilterProxyModel> class MyModel : public QStandardItemModel { public: MyModel(QObject *parent = nullptr) : QStandardItemModel(parent) {} }; class MyProxyModel : public QSortFilterProxyModel { public: explicit MyProxyModel(QObject *parent = nullptr) : QSortFilterProxyModel(parent) {} // 横向布局 int columnCount(const QModelIndex &parent) const override { return 2; } Qt::Orientation orientation() const override { return Qt::Horizontal; // 设置为水平布局 } }; ``` 接下来,在主窗口中设置`QListView`: ```cpp int main(int argc, char *argv[]) { QApplication app(argc, argv); // 创建数据源 MyModel model; // 自定义代理模型 MyProxyModel proxyModel(&model); proxyModel.setSourceModel(&model); // 将模型连接到代理 // 创建视图,并设置布局和代理 QListView listView; listView.setModel(&proxyModel); listView.setViewMode(QListView::TwoColumns); listView.setItemDelegateForColumn(0, new QStyledItemDelegate()); // 第一列可以使用默认样式,第二列自定义 listView.setItemDelegateForColumn(1, new YourCustomItemDelegate()); // 替换为你自定义的列样式 // 显示窗口 QMainWindow window; window.setCentralWidget(&listView); window.show(); return app.exec(); } ``` 在这个例子中,你需要实现`YourCustomItemDelegate()`类来自定义第二个列的外观。记得在`main.cpp`中添加这个类的实现,包括绘制、大小调整等细节。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值