Поиск события щелчка в заголовке Qml TableView при нажатии столбца

В этом примере у меня есть 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

Спасибо за любую помощь.

Не добавляйте РЕШЕНО к заголовку вашего вопроса

eyllanesc 07.04.2019 19:54
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
1 091
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать прокси-модель для сортировки вашей модели. Но компонента 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 столбец, поэтому он использует свойства, также известные как роли и имена, для сопоставления атрибутов со столбцами, но, похоже, я мог бы использовать делегат, чтобы попытаться раскрыть событие щелчка, но выполнить сортировку будет сложнее, чем выполнить обновление модели с запросом, что я и хочу сделать, просто обновите модель, а не сортируйте их. Спасибо за альтернативу, это полезно знать, другим, кто найдет это, эта идея может понравиться больше.

user83395 07.04.2019 04:00

В этом случае замените код в onSortIndicatorColumnChanged и onSortIndicatorOrderChanged на tableView.model = (sortIndicatorColumn == 0) ?myListModel1 : myListModel2.

Dimitry Ernot 07.04.2019 09:57

Это сработало, спасибо, не знаю, как пометить этот ответ как принятый, поэтому я приму ваш первый, поэтому, пожалуйста, обновите его, чтобы отразить это, еще раз спасибо.

user83395 07.04.2019 19:49

Другие вопросы по теме