zoukankan      html  css  js  c++  java
  • QML 用QSortFilterProxyModel实现搜索功能

    搞了一晚上终于实现了,写个博客纪念一下吧。

    c++部分的代码:

    #include <QQmlApplicationEngine>
    #include <QQmlContext>
    #include <QtQml>
    ...
    #include "bookmodel.h"
    int main(int argc, char *argv[])
    {
        ...
        qmlRegisterType<BookModel>("Backend", 1, 0, "BookModel");//向qml注册类型
    
        BookModel *bookModel = new BookModel();//这是自己定义的类
        QSortFilterProxyModel *proxyModel = new QSortFilterProxyModel();
        ...
        bookModel->read(io->text()["book"]);//io是自己定义的读取json的类
        QQmlApplicationEngine *engine = new QQmlApplicationEngine();
    
        proxyModel->setSourceModel(bookModel);
        //向qml传递变量
        engine->rootContext()->setContextProperty("bookModel", bookModel);
        engine->rootContext()->setContextProperty("proxyModel", proxyModel);
    
        engine->load(QUrl(QLatin1String("qrc:/main.qml")));
    
        return app.exec();
    }
    

    qml部分的代码:
    Search是自己写的一个搜索框

    import QtQuick 2.7
    import QtQuick.Controls 2.1
    import QtQuick.Layouts 1.3
    import QtQuick.Controls.Material 2.1
    import QtQuick.Controls.Universal 2.1
    import QtQuick.Window 2.1
    import Backend 1.0
    LDialog{//LDialog是自己修改过的的对话框Dialog
        title: "查找"
         460
        height: 180
        signal search(int range, string text)
        Row{
            spacing: 20
            ComboBox{
                id: combo
                model:[qsTr("书名"),qsTr("出版社"),qsTr("作者"),qsTr("简介"),qsTr("购书日期"),qsTr("id"),qsTr("ISBN号"),qsTr("价格")]
            }
            TextField {
                id: word
                 200
            }
            Button {
                id: searchBtn
                text: qsTr("查找")
    
                onClicked: {
                    var comap=new Array(BookModel.NameRole,BookModel.PublishRole,BookModel.AuthorRole,
                    BookModel.BriefRole,BookModel.BuyTimeRole,BookModel.IdRole,
                        BookModel.IsbnRole,BookModel.PriceRole);//这里的Role是BookModel类里面的一个enum
                    search(comap[combo.currentIndex],word.text);
                }
            }
        }
    }
    

    使用时:

        Search{
            id: findBookDialog
            onSearch: {
                proxyModel.filterRole=range;//这个filterRole是proxyModel搜索的范围,也就是指定BookModel中的一个属性
                proxyModel.setFilterFixedString(text);//设置搜索内容
                bookView.model=proxyModel;//设置展示的内容为搜索筛选后的
            }
            onRejected: {//取消时显示原来的内容
                bookView.model=bookModel;
            }
        }
    
  • 相关阅读:
    visual studio项目多级引用不拷贝dll的问题
    ef6 code first,对已有数据库如何执行迁移
    wsl 修改默认安装路径
    Windows docker镜像文件无法删除
    Docker镜像下载很慢,各种加速无效
    activemq整合springboot使用(个人微信小程序用)
    angular入门一之环境安装及项目创建
    jquery中attr()和prop()的区别
    IntelliJ IDEA部署web项目,Tomcat没有出现Artifacts
    IntelliJ IDEA:创建Java Web工程
  • 原文地址:https://www.cnblogs.com/flipped/p/6759893.html
Copyright © 2011-2022 走看看