поиск события щелчка в заголовке Qml TableView при нажатии на столбец - PullRequest
0 голосов
/ 07 апреля 2019

У меня есть 2 статических ListModel в этом примере, в действительности я использую LocalStorage, чтобы заполнить ListModel, но для простоты я добавил 2 кнопки, чтобы изменить Модели, но я хочу связать его с событием щелчка столбца заголовка TableView. и не могу понять, как это сделать из других примеров попыток сортировки, я не знаю, возможно ли выполнить сортировку с использованием ListModel, я не смог найти ни одного примера, поэтому кто-то может объяснить это или показать пример, о том, как заменить кнопки событиями щелчка в столбце, я могу использовать это для передачи сортировки по аргументу в мой SQL-оператор LocalStorage для обновления ListModel.

Обновление: я забыл упомянуть, что искал решение Qml / Qml JavaScript, по какой-то причине я подумал, что если я уберу тег C ++, я бы избежал этой проблемы, я буду использовать этот метод в качестве крайней меры, так как Я решил написать это приложение, используя только Qml, без серверной части C ++, но у меня есть эта версия сейчас, так как у меня были проблемы с тем, как я импортировал JavaScript, написанный для Web, в отличие от Qml JavaScript, который отличается от ,

Чтобы было ясно, я пытаюсь изменить модели, а не сортировать строки, это не тот же вопрос, разница в том, как используется событие click, и все, что я хочу сделать, это изменить имя запроса. в конце, который является Qml JavaScript, причина, по которой я не хочу решений C ++, заключается в том, что я делаю это в Felgo, но это не вопрос Felgo, он отлично работает с C ++, но вы должны настроить Live для работы с этим, и на самом деле это будет исходный код, который я открываю для github и хочу, чтобы он мог работать без C ++, и, похоже, должен быть способ перехватить это, и Мышь сработал для меня, захватывая его даже не загружать заголовок, так как он перехватывает в начале и ждет ввода, но если мне придется, я уверен, что ваше решение будет работать, тогда я приму его, извините за эту путаницу, я запутался в том, что использовать теги, поэтому изначально я включил только qml, и к нему был добавлен qt, что, хотя я и был хорошей идеей, потому что это действительно вопрос Qt, который касается Только для Qml, а не C ++, это еще один тег, это тенденция, которую продвигает Felgo, и у них есть веские причины, ее проще использовать программистам на JavaScript или C / C ++, а Live Debugging работает быстрее, когда используется без Серверная часть C ++, так что теперь я дал больше информации, когда Первоначально я думал, что это был простой вопрос, который касается только Qml, если нет, то был дан ответ для C ++, если нет лучшего способа увидеть, как все, что я хочу сделать, это нажать на заголовок столбца так же, как я хотел бы на кнопку, могу ли я вставить кнопку в столбец? Если так, то как? Я не смог найти пример этого, только те, которые влияли бы на свойства текста и сортировали строки, а это не то, что я пытался сделать, только обновляли модель.

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

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

1 Ответ

1 голос
/ 07 апреля 2019

Вы можете использовать прокси-модель для сортировки вашей модели.Но там нет компонента 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
    }

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...