Мне нужно создать интеграцию между Qt
а также qml
, откуда Qt
Я прошу некоторую информацию на сервер, создать tablemodel
от Qt
и выставить информацию qml
, Я достиг этой точки, но теперь я должен отсортировать информацию. Я использую QSortFilterProxyModel
большинство примеров, которые я нашел, созданы для виджетов и создают tableview
от Qt
, но когда я пытался создать его из qml
нет выбора "setSortingEnabled"
, в qml
У меня много объектов не только TableView
, Я использовал заказ model->sort(1, Qt:AscendingOrder)
но нет изменений в qml
экран
SimMainWindow.cpp
#include "SimMainWindow.h"#include "TurnDisplayTable.h"#include "TurnDisplayItem.h"#include <QtQml>
#include <QGraphicsObject>
#include <QDebug>
#include <QDeclarativeView>
#include <QQuickView>
#include <QQmlApplicationEngine>
#include <QtWidgets>
#include <QMainWindow>
#include <tablemodel.h>
#include <QSortFilterProxyModel>
SimMainWindow::SimMainWindow(int argc, char **argv): QGuiApplication(argc, argv), view()
{
qDebug() << "begin"; ///////////////////////////////
qmlRegisterType<TurnDisplayTable>("TurnDisplayTable", 1,0, "TurnDisplayTable");
filesModel= new TurnDisplayTable();
view.rootContext()->setContextProperty("idFilesModel", filesModel);
proxyModel = new QSortFilterProxyModel(this);
proxyModel->setSourceModel(filesModel);
proxyModel->sort(1, Qt::AscendingOrder);
view.rootContext()->setContextProperty("pModel", proxyModel);
view.setSource( QUrl::fromLocalFile("./ui/main.qml") );
QObject::connect((QObject*)view.rootObject(), SIGNAL(refreshMsg()), this, SLOT(refreshHome()));
QObject::connect((QObject*)view.rootObject(), SIGNAL(changeMsg()), this, SLOT(changeHome()));
QObject::connect((QObject*)view.rootObject(), SIGNAL(sortMsg()), this, SLOT(sortHome()));
QObject::connect((QObject*)view.rootObject(), SIGNAL(infoMsg(QString, QString)), this, SLOT(infoHome(QString, QString)));view.show();
qDebug() << "end"; ///////////////////////////////
}SimMainWindow::~SimMainWindow()
{}
void SimMainWindow::refreshHome()
{
qDebug() << "refresh";
QList<TurnDisplayItem> list;
QString turn = "2";
QString date = "septiembre";
TurnDisplayItem item(turn, date);
list << item;
turn = "4";
date = "mayo";
TurnDisplayItem item2(turn, date);
list << item2;
turn = "1";
date = "julio";
TurnDisplayItem item3(turn, date);
list << item3;
turn = "3";
date = "abril";
TurnDisplayItem item4(turn, date);
list << item4;
turn = "2";
date = "mayo";
TurnDisplayItem item5(turn, date);
list << item5;filesModel->setCurrencyMap(list);
proxyModel->setSourceModel(filesModel);
proxyModel->sort(1, Qt::AscendingOrder);
}
void SimMainWindow::changeHome()
{
qDebug() << "cambio";
QList<TurnDisplayItem> list;
QString turn = "3";
QString date = "sep";
TurnDisplayItem item(turn, date);
list << item;
turn = "1";
date = "may";
TurnDisplayItem item2(turn, date);
list << item2;
turn = "2";
date = "jul";
TurnDisplayItem item3(turn, date);
list << item3;
turn = "6";
date = "abr";
TurnDisplayItem item4(turn, date);
list << item4;
turn = "9";
date = "oct";
TurnDisplayItem item5(turn, date);
list << item5;filesModel->setCurrencyMap(list);
}
void SimMainWindow::sortHome()
{
proxyModel->sort(0, Qt::AscendingOrder);
view.rootContext()->setContextProperty("pModel", proxyModel);
qDebug()<< "sort...";
view.show();
}
void SimMainWindow::infoHome(const QString &turnH, const QString &dateH)
{
qDebug() << "info";
QList<TurnDisplayItem> list;
QString turn = turnH;
QString date = dateH;
TurnDisplayItem item(turn, date);
list << item;
filesModel->setCurrencyMap(list);
}
Попробуйте это, это работает в моем случае:
Model model;
QSortFilterProxyModel proxyModel;
proxyModel.setSortRole(Model::YOURCUSTOM_ROLE_HERE);
proxyModel.setSourceModel(&model);
proxyModel.setDynamicSortFilter(true);
proxyModel.sort(0);
Я подозреваю, что ваша модель не сортирует, потому что вы должны установить целевую роль, установив setSortRole(int role)
и нанесение void QSortFilterProxyModel::sort(int column, Qt::SortOrder order = Qt::AscendingOrder) [virtual]
,
Я надеюсь, что это решит вашу проблему.