dae1dcaa13
Implement strict less in lessThan override. This function is used as the < operator when sorting. + avoid row invalidation if the model component is not ready + `Sorter::invalidate` is virtual. It provides more control to the derived classes |
||
---|---|---|
docs | ||
filters | ||
proxyroles | ||
sorters | ||
tests | ||
.gitignore | ||
CMakeLists.txt | ||
LICENSE | ||
README.md | ||
SortFilterProxyModel.pri | ||
SortFilterProxyModel.qbs | ||
index.qdoc | ||
offline.css | ||
qpm.json | ||
qqmlsortfilterproxymodel.cpp | ||
qqmlsortfilterproxymodel.h | ||
qqmlsortfilterproxymodeltypes.cpp | ||
qqmlsortfilterproxymodeltypes.h | ||
sortfilterproxymodel.qdocconf |
README.md
SortFilterProxyModel
SortFilterProxyModel is an implementation of QSortFilterProxyModel
conveniently exposed for QML.
Install
With qpm :
qpm install fr.grecko.sortfilterproxymodel
- add
include(vendor/vendor.pri)
in your .pro if it is not already done import SortFilterProxyModel 0.2
to use this library in your QML files
Without qpm :
- clone or download this repository
-
qmake
addinclude (<path/to/SortFilterProxyModel>/SortFilterProxyModel.pri)
in your.pro
CMake
add $<TARGET_OBJECTS:SortFilterProxyModel> to the sources of your executable target in your cmake project
import SortFilterProxyModel 0.2
to use this library in your QML files
Sample Usage
- You can do simple filtering and sorting with SortFilterProxyModel:
import QtQuick 2.2
import QtQuick.Controls 1.2
import SortFilterProxyModel 0.2
ApplicationWindow {
visible: true
width: 640
height: 480
ListModel {
id: personModel
ListElement {
firstName: "Erwan"
lastName: "Castex"
favorite: true
}
// ...
}
TextField {
id: textField
anchors { top: parent.top; left: parent.left; right: parent.right }
height: implicitHeight
}
SortFilterProxyModel {
id: personProxyModel
sourceModel: personModel
filters: RegExpFilter {
roleName: "lastName"
pattern: textField.text
caseSensitivity: Qt.CaseInsensitive
}
sorters: StringSorter { roleName: "firstName" }
}
ListView {
anchors { top: textField.bottom; bottom: parent.bottom; left: parent.left; right: parent.right }
model: personProxyModel
delegate: Text { text: model.firstName + " " + model.lastName}
}
}
Here the ListView
will only show elements that contains the content of the TextField
in their lastName
role.
- But you can also achieve more complex filtering or sorting with multiple
filters
andsorters
:
SortFilterProxyModel {
id: personProxyModel
sourceModel: personModel
filters: [
ValueFilter {
enabled: onlyShowFavoritesCheckbox.checked
roleName: "favorite"
value: true
},
AnyOf {
RegExpFilter {
roleName: "lastName"
pattern: textField.text
caseSensitivity: Qt.CaseInsensitive
}
RegExpFilter {
roleName: "firstName"
pattern: textField.text
caseSensitivity: Qt.CaseInsensitive
}
}
]
sorters: [
RoleSorter { roleName: "favorite"; sortOrder: Qt.DescendingOrder },
StringSorter { roleName: "firstName" },
StringSorter { roleName: "lastName" }
]
}
CheckBox {
id:onlyShowFavoritesCheckbox
}
This will show in the corresponding ListView
only the elements where the firstName
or the lastName
match the text entered in the textField
, and if the onlyShowFavoritesCheckbox
is checked it will aditionnally filter the elements where favorite
is true
.
The favorited elements will be shown first and all the elements are sorted by firstName
and then lastName
.
Showcase Application
You can find an application showcasing this library here: https://github.com/oKcerG/SFPMShowcase
License
This library is licensed under the MIT License.
Documentation
This component is a subclass of QSortFilterProxyModel
, to use it, you need to set the sourceModel
property to a QAbstractItemModel*
with correct role names.
This means you can use it with custom c++ models or ListModel
, but not with JavaScript models like arrays, integers or object instances.
The complete documentation reference is available here: https://okcerg.github.io/SortFilterProxyModel/
Contributing
Don't hesitate to open an issue about a suggestion, a bug, a lack of clarity in the documentation, etc.
Pull requests are also welcome, if it's a important change you should open an issue first though.