В этом примере у меня есть 2 статических ListModel, на самом деле я использую LocalStorage для заполнения ListModel, но для простоты я добавил 2 кнопки для изменения моделей, но я хочу привязать их к событию щелчка столбца заголовка TableView и могу не понимаю, как это сделать из других примеров попытки сортировки, я не знаю, возможно ли сортировать с помощью ListModel, я не смог найти ни одного примера, поэтому может кто-нибудь объяснить это или показать пример того, как замените кнопки событиями щелчка столбца, затем я могу использовать это, чтобы передать сортировку по аргументу моему SQL-оператору LocalStorage для обновления ListModel.
Обновление: я забыл упомянуть, что искал решение для Qml/Qml JavaScript, по какой-то причине я подумал, что если я оставлю тег C++, я избегу этой проблемы, я буду использовать этот метод в крайнем случае, так как я решил напишите это приложение, используя только Qml, без серверной части C++, но у меня сейчас есть эта версия, так как у меня были проблемы с тем, как я импортировал JavaScript, написанный для Интернета, в отличие от Qml JavaScript, который не то же самое.
Чтобы было ясно, я пытаюсь изменить модели, а не сортировать строки, это не один и тот же вопрос, разница заключается в том, как используется событие щелчка, и все, что я хочу сделать, это изменить имя запроса сзади end, то есть Qml JavaScript, причина, по которой мне не нужны решения C++, заключается в том, что я делаю это в Felgo, но это не вопрос Felgo, он отлично работает с C++, но вам нужно настроить Live для работы с ним, и на самом деле это будет исходный код, который я открываю на github и хочу, чтобы он мог работать без C++, и, похоже, должен быть способ перехватить это, и мышь действительно работала для меня, захватив его даже удерживайте заголовок от загрузки, так как он цепляется в начале и ждет ввода, но если мне нужно, я уверен, что ваше решение будет работать, тогда я приму его, извините за эту путаницу, я запутался в том, какие теги использовать , поэтому изначально я включил только qml, и к нему был добавлен qt, что, как мне кажется, было отличной идеей, потому что это действительно вопрос Qt, который относится к Только Qml, а не C++, это еще один тег, это тенденция, которую продвигает Felgo, и у них есть веские причины, ее легче использовать программистам JavaScript или C/C++, а Live Debugging работает быстрее при использовании без поддержки C++. конец, так что теперь я дал больше информации, когда изначально я думал, что это был простой вопрос, который относился только к Qml, если нет, то ответ был дан для С++, если нет лучшего способа, видя, как все, что я хочу сделать щелкнуть по столбцу заголовка так же, как и по кнопке, могу ли я встроить кнопку в столбец? Если да, то как? Я не смог найти пример этого, только те, которые влияли бы на свойства текста и сортировали строки, чего я не пытался сделать, а только обновлял модель.
import QtQuick 2.11
import QtQuick.Controls 1.3
import QtQuick.Layouts 1.3
import QtQuick.Window 2.11
Window {
visible: true
width: 640
height: 480
title: qsTr("TableView Sort")
Column {
id: column
spacing: 9
anchors.fill: parent
TableView {
id: tableView
anchors.left: column.left
anchors.leftMargin: 6
anchors.right: column.right
anchors.rightMargin: 273
highlightOnFocus: true
model: myListModel1
sortIndicatorVisible: true
TableViewColumn {
role: "title"
title: "Column 1"
//width: 133
}
TableViewColumn {
role: "description"
title: "Column 2"
//width: 166
}
}
Button {
id: button1
text: qsTr("Model 1")
anchors.left: column.left
anchors.leftMargin: 6
onClicked: {
tableView.model = myListModel1
}
}
Button {
id: button2
text: qsTr("Model 2")
anchors.left: column.left
anchors.leftMargin: 6
onClicked: {
tableView.model = myListModel2
}
}
}
ListModel {
id: myListModel1
ListElement {
title: "Orange"
description: "Orange is Orange"
}
ListElement {
title: "Banana"
description: "Yellow"
}
ListElement {
title: "Apple"
description: "Red"
}
}
ListModel {
id: myListModel2
ListElement {
title: "Apple"
description: "Red"
}
ListElement {
title: "Banana"
description: "Yellow"
}
ListElement {
title: "Orange"
description: "Orange is Orange"
}
}
}
Обновление: это сработало
onSortIndicatorColumnChanged: tableView.model = (sortIndicatorColumn == 0) ? myListModel1 : myListModel2
onSortIndicatorOrderChanged: tableView.model = (sortIndicatorColumn == 0) ? myListModel1 : myListModel2
Спасибо за любую помощь.
Вы можете использовать прокси-модель для сортировки вашей модели. Но компонента QML нет, и вы должны использовать QSortFilterProxyModel
.
Это довольно легко сделать. Но QSortFilterProxyModel
не предназначен для использования с табличным представлением QML (ваша таблица использует имена ролей для отображения столбцов, а прокси-модель будет пытаться сортировать по индексу).
Краткий пример:
class SortProxyModel : public QSortFilterProxyModel
{
Q_OBJECT
public:
SortProxyModel(): QSortFilterProxyModel ()
{
}
// Define the way you want to sort data
bool lessThan(const QModelIndex& left, const QModelIndex& right) const
{
int role = sourceModel()->roleNames().key(roleName.toLocal8Bit(), 0);
return left.data(role) < right.data(role);
}
Q_INVOKABLE void setSortRole(QString const& roleName) // Used to select the sort role
{
this->roleName = roleName;
}
Q_INVOKABLE virtual void sort(int /*column*/, Qt::SortOrder order = Qt::AscendingOrder)
{
QSortFilterProxyModel::sort(0, order); // Always use the first column.
}
private:
QString roleName; // Role used to sort the model
};
// main.cpp
// Declare your type to use it in QML
qmlRegisterType<SortProxyModel>("SortProxyModel", 0, 1, "SortProxyModel");
// Main.qml
import SortFilterProxyModel 0.1;
TableView {
id: tableView
model: proxy // Use the proxy model rather than the model itself
sortIndicatorVisible: true
onSortIndicatorColumnChanged: { // Called when you click on the header
if (sortIndicatorColumn == 0) // Set the role used to sort data
model.setSortRole("title");
else
model.setSortRole("description");
model.sort(sortIndicatorColumn, sortIndicatorOrder)
}
onSortIndicatorOrderChanged: { // Called when you click on the header
if (sortIndicatorColumn == 0) // Set the role used to sort data
model.setSortRole("title");
else
model.setSortRole("description");
model.sort(sortIndicatorColumn, sortIndicatorOrder)
}
SortProxyModel {
id: proxy
objectName: "proxy"
sourceModel: myListModel1
}
Это просто быстрый пример, и вы должны улучшить код. Но, думаю, это будет хорошее начало...
Я обновил свой вопрос, чтобы ограничить его только Qml. Посмотрев на сортировку, выполненную в C++, я понял, что TableView имеет только 1 столбец, поэтому он использует свойства, также известные как роли и имена, для сопоставления атрибутов со столбцами, но, похоже, я мог бы использовать делегат, чтобы попытаться раскрыть событие щелчка, но выполнить сортировку будет сложнее, чем выполнить обновление модели с запросом, что я и хочу сделать, просто обновите модель, а не сортируйте их. Спасибо за альтернативу, это полезно знать, другим, кто найдет это, эта идея может понравиться больше.
В этом случае замените код в onSortIndicatorColumnChanged
и onSortIndicatorOrderChanged
на tableView.model = (sortIndicatorColumn == 0) ?myListModel1 : myListModel2
.
Это сработало, спасибо, не знаю, как пометить этот ответ как принятый, поэтому я приму ваш первый, поэтому, пожалуйста, обновите его, чтобы отразить это, еще раз спасибо.
Не добавляйте РЕШЕНО к заголовку вашего вопроса