Size: a a a

2020 July 15

VK

Valentin Kornienko in Qt
Anatoly Shirokov
предположим у тебя модель, 0 строк. добавляешь первые, сообщаешь виду через begin/endInsertRows, добавляешь еще и т. д. до 10. добавился 11-ый. не надо добавлять и удалять, просто удали из массива первый и добавь в конец, и для 10 элементов вызови emit dataChanged, чтобы вид обновил содержимое, получишь эффект скользящего окна
я просто пробовал вызывать в принципе
  emit dataChanged(
           index(0,0)
       ,   index(rowCount() - 1,0)
   );
 после добавления элементов, но не получал ожидаемый эффект
источник

i

ilya \r\n in Qt
Егор
Угу, лист не список, сет не дерево, неочевидно как-то. Хотя не удивлюсь если эти контейнеры еще до стандартного С++ существовали
Та думаю так и есть
источник

AS

Anatoly Shirokov in Qt
Valentin Kornienko
я просто пробовал вызывать в принципе
  emit dataChanged(
           index(0,0)
       ,   index(rowCount() - 1,0)
   );
 после добавления элементов, но не получал ожидаемый эффект
ты роли не указал
источник

D

Dmitriy in Qt
Егор
Угу, лист не список, сет не дерево, неочевидно как-то. Хотя не удивлюсь если эти контейнеры еще до стандартного С++ существовали
По-моему, std::map на RB-trees существует с очень давних времён... Когда QMap ещё на списках с пропусками был.
источник

VK

Valentin Kornienko in Qt
Anatoly Shirokov
ты роли не указал
The optional roles argument can be used to specify which data roles have actually been modified. An empty vector in the roles argument means that all roles should be considered modified. 

вроде бы так?
источник

GS

Georgy Shepelev in Qt
Valentin Kornienko
я просто пробовал вызывать в принципе
  emit dataChanged(
           index(0,0)
       ,   index(rowCount() - 1,0)
   );
 после добавления элементов, но не получал ожидаемый эффект
со старым кодом? У тебя же нет обновления первых элементов
источник

VK

Valentin Kornienko in Qt
У меня элементы добавляются в начало, забыл об этом упомянуть
источник

VK

Valentin Kornienko in Qt
@anatolijs  @geshep @FPOHTMEH  спасибо огромное!
источник

VK

Valentin Kornienko in Qt
Заработало!
источник

AS

Anatoly Shirokov in Qt
Valentin Kornienko
@anatolijs  @geshep @FPOHTMEH  спасибо огромное!
что было?
источник

VK

Valentin Kornienko in Qt
Да я данные тестовые криво генерировал. Из-за этого казалось, что данные не меняются после dataChanged
источник

AS

Anatoly Shirokov in Qt
Valentin Kornienko
Да я данные тестовые криво генерировал. Из-за этого казалось, что данные не меняются после dataChanged
а то я уже тебе набросал:
#include <QGuiApplication>
#include <QQmlApplicationEngine>

#include <QAbstractListModel>
#include <QDebug>
#include <QHash>
#include <QQmlContext>

#include <deque>

class MyModel : public QAbstractListModel {
 Q_OBJECT;

private:
 std::deque<int> array;
 size_t capacity = 10;

public:
 Q_INVOKABLE void add(int v) {
   if (array.size() == capacity) {
     array.pop_back();
     array.push_front(v);
     emit dataChanged(index(0), index(array.size() - 1));
   } else {
     array.push_front(v);
     beginInsertRows(QModelIndex(), 0, 0);
     endInsertRows();
   }
 }
 // QAbstractItemModel interface
public:
 virtual int rowCount(const QModelIndex& parent) const override {
   if (parent.isValid())
     return 0;
   return array.size();
 }
 virtual QVariant data(const QModelIndex& index, int role) const override {
   if (index.isValid()) {
     switch (role) {
       case Qt::UserRole: {
         return array[index.row()];
       }
     }
   }
   return QVariant();
 }
 virtual QHash<int, QByteArray> roleNames() const override {
   static QHash<int, QByteArray> roles = {{Qt::UserRole, QByteArray{"name"}}};
   return roles;
 }
};

int main(int argc, char* argv[]) {
 QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

 QGuiApplication app(argc, argv);

 QQmlApplicationEngine engine;
 MyModel model;
 engine.rootContext()->setContextProperty("globalModel", &model);
 const QUrl url(QStringLiteral("qrc:/main.qml"));
 QObject::connect(
     &engine, &QQmlApplicationEngine::objectCreated, &app,
     [url](QObject* obj, const QUrl& objUrl) {
       if (!obj && url == objUrl)
         QCoreApplication::exit(-1);
     },
     Qt::QueuedConnection);
 engine.load(url);

 return app.exec();
}

#include "main.moc"

import QtQuick 2.12
import QtQuick.Window 2.12

Window {
   visible: true
   width: 640
   height: 480
   title: qsTr("Hello World")

   property int counter: 0

   ListView {
       model: globalModel
       delegate: Text {
           text: name
       }
       anchors.fill: parent
   }

   Timer {
       repeat: true
       running: true
       interval: 1000
       onTriggered: {
           globalModel.add(++counter)
       }
   }
}
источник

Е

Егор in Qt
А можно вопрос, возможно шаред либу из ресурсов загрузить QLibrary r(":/libfile.so");? Вопрос не практический, ради интереса
источник

VK

Valentin Kornienko in Qt
Anatoly Shirokov
а то я уже тебе набросал:
#include <QGuiApplication>
#include <QQmlApplicationEngine>

#include <QAbstractListModel>
#include <QDebug>
#include <QHash>
#include <QQmlContext>

#include <deque>

class MyModel : public QAbstractListModel {
 Q_OBJECT;

private:
 std::deque<int> array;
 size_t capacity = 10;

public:
 Q_INVOKABLE void add(int v) {
   if (array.size() == capacity) {
     array.pop_back();
     array.push_front(v);
     emit dataChanged(index(0), index(array.size() - 1));
   } else {
     array.push_front(v);
     beginInsertRows(QModelIndex(), 0, 0);
     endInsertRows();
   }
 }
 // QAbstractItemModel interface
public:
 virtual int rowCount(const QModelIndex& parent) const override {
   if (parent.isValid())
     return 0;
   return array.size();
 }
 virtual QVariant data(const QModelIndex& index, int role) const override {
   if (index.isValid()) {
     switch (role) {
       case Qt::UserRole: {
         return array[index.row()];
       }
     }
   }
   return QVariant();
 }
 virtual QHash<int, QByteArray> roleNames() const override {
   static QHash<int, QByteArray> roles = {{Qt::UserRole, QByteArray{"name"}}};
   return roles;
 }
};

int main(int argc, char* argv[]) {
 QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

 QGuiApplication app(argc, argv);

 QQmlApplicationEngine engine;
 MyModel model;
 engine.rootContext()->setContextProperty("globalModel", &model);
 const QUrl url(QStringLiteral("qrc:/main.qml"));
 QObject::connect(
     &engine, &QQmlApplicationEngine::objectCreated, &app,
     [url](QObject* obj, const QUrl& objUrl) {
       if (!obj && url == objUrl)
         QCoreApplication::exit(-1);
     },
     Qt::QueuedConnection);
 engine.load(url);

 return app.exec();
}

#include "main.moc"

import QtQuick 2.12
import QtQuick.Window 2.12

Window {
   visible: true
   width: 640
   height: 480
   title: qsTr("Hello World")

   property int counter: 0

   ListView {
       model: globalModel
       delegate: Text {
           text: name
       }
       anchors.fill: parent
   }

   Timer {
       repeat: true
       running: true
       interval: 1000
       onTriggered: {
           globalModel.add(++counter)
       }
   }
}
Боже мой. Спасибо!
источник

AS

Anatoly Shirokov in Qt
Егор
А можно вопрос, возможно шаред либу из ресурсов загрузить QLibrary r(":/libfile.so");? Вопрос не практический, ради интереса
нет, надо в темп и только потом грузить
источник

Е

Егор in Qt
Anatoly Shirokov
нет, надо в темп и только потом грузить
Темп это просто файл какой-то?
источник

AS

Anatoly Shirokov in Qt
Егор
Темп это просто файл какой-то?
ну да, темповый файл
источник

Е

Егор in Qt
ага, спасибо
источник

F

FPOHTMEH in Qt
Valentin Kornienko
@anatolijs  @geshep @FPOHTMEH  спасибо огромное!
Здесь можешь посмотреть как я сделал вложенные модели https://github.com/fpohtmeh-github/qt-experiments/tree/master/NestedModels
Вложенная модель сама создаётся и удаляется в QML, а не плюсах 🤘🏻
источник

F

FPOHTMEH in Qt
FPOHTMEH
Здесь можешь посмотреть как я сделал вложенные модели https://github.com/fpohtmeh-github/qt-experiments/tree/master/NestedModels
Вложенная модель сама создаётся и удаляется в QML, а не плюсах 🤘🏻
Можно сделать вложенностей сколько захочешь, главное выбирать глобально-разные именна для ролей, потому что index и modelData доступны только для модели последней вложенности.
Если кто-то знает другой workaround -  пишите)
источник