Qt / QML: обработка std :: vector <int> - PullRequest
       26

Qt / QML: обработка std :: vector <int>

0 голосов
/ 07 февраля 2019

Редактировать: проблема была только с 5.6, которая имеет сокращенный набор поддерживаемых "родных" типов в соответствии с https://doc.qt.io/qt-5.6/qtqml-cppintegration-data.html против последней версии ...

Согласнона эту страницу: https://doc.qt.io/qt-5/qtqml-cppintegration-data.html, std::vector<int> поддерживается QML, если зарегистрирован в qRegisterMetaType() и доступен / доступен как свойство.Однако я не могу заставить это работать.

Мой класс (который может быть создан в QML, поэтому этот уровень работает) имеет объявления типа:

// prop decl
Q_PROPERTY(std::vector<int> myVector READ myVector NOTIFY myVectorChanged)
// read accessor
Q_INVOKABLE std::vector<int> recordTime() const;
// signal (in signal section)
void myVectorChanged();

Регистрация через

qRegisterMetaType<std::vector<int> >("std::vector<int>");

Когда я вставляю что-то в вектор и пытаюсь получить доступ к myVector.length или myVector.size, он возвращает «undefined» (size () не вызывается).Как мне перебрать элементы?На странице, указанной выше, написано: «Некоторые типы последовательностей C ++ прозрачно поддерживаются в QML, чтобы вести себя как типы массивов JavaScript» (и в списке упоминается std::vector<int>), поэтому я ожидал length и индексный доступ к работе.

1 Ответ

0 голосов
/ 07 февраля 2019

В документации сказано, что этот контейнер будет автоматически преобразован в массив JS.Вам не нужно ничего регистрировать.

Конечно, преобразование будет копией, поэтому изменение его не приведет к изменению исходного массива, и то, как вы используете его, аналогично тому, как вы используете обычный JSмассив.Он определенно должен иметь свойство length (не length()) и доступ к индексу поддержки через [].

Обновление:

После ваших историй неудач я решил на самом деле запустить простойtest:

class Test : public QObject {
    Q_OBJECT
  public slots:
    std::vector<int> test() { return std::vector<int> {1, 2, 3, 4, 5, 6, 7}; }
};

// in main.cpp
qmlRegisterType<Test>("Core", 1, 0, "Test"); 

  // in qml
  Test {
    Component.onCompleted: {
      var t = test()
      console.log(t.length, t) // qml: 7 [1,2,3,4,5,6,7]
    }
  }

Как видите, он дает ожидаемый результат, не нужно ничего регистрировать.

IIRC была проблема с Qt, которая по какой-то причине вызвала эти автоматические преобразования, а не , когда вы используете интерфейс Q_PROPERTY.Я полагаю, что проблема по-прежнему актуальна, и, к счастью, решение состоит в том, чтобы просто использовать не свойство, а простое возвращаемое значение.

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

...