Является ли QObjectList полным синонимом QList? ? - PullRequest
0 голосов
/ 18 марта 2020

Я наблюдаю очень странное поведение в Qt5.5.1

Я использую Qt с WebKit (давайте предположим, что я не могу перейти на более новый Qt с WebEngine). Javascript в QWebView использует WebKit Bridge для доступа к коду C ++. Все идет нормально. Теперь я хочу, чтобы объект моста выставлял свойство, представляющее собой массив объектов. Вот небольшой код JS (мост - это объект, который обеспечивает мост к коду C ++):

<script>
    alert(bridge.objectList);
    alert(bridge.objectList.length);
</script>

Код C ++, который реализует этот объект:

class Bridge : public QObject
{
    Q_OBJECT
public:
    Q_PROPERTY(QObjectList objectList READ objectList);

    QObjectList objectList()
    {
        QObjectList lst;
        lst.append(this);
        return lst;
    }
};

Я ожидаю этот код JS сообщит действительный список объектов, а длина списка равна 1.

Фактически наблюдаемое поведение таково: bridge.objectList == null.

Наверняка этого недостаточно доказать правильность кода. Однако при изучении проблемы у меня есть код, который работает как ожидалось. Ниже приведены те же самые фрагменты кода с добавленным закомментированным кодом. Если вы раскомментируете закомментированные строки, bridge.objectList возвращает действительный объект, а bridge.objectList.length возвращает 1.

<script>
    //bridge.anotherList;
    alert(bridge.objectList);
    alert(bridge.objectList.length);
</script>
class Bridge : public QObject
{
    Q_OBJECT
public:
    Q_PROPERTY(QObjectList objectList READ objectList);
    //Q_PROPERTY(QList<QObject*> anotherList READ anotherList);

    QObjectList objectList()
    {
        QObjectList lst;
        lst.append(this);
        return lst;
    }

    //QList<QObject*>anotherList()
    //{
    //    QList<QObject*> lst;
    //    return lst;
    //}
};

Два дополнительных наблюдения:

  • Фактически Неважно, какой тип T использовать для создания экземпляра QList<T> из anotherList. Например, это может быть QList<int>.
  • Если я заменю QObjectList на QList<QObject*> на objectList в первом фрагменте, волшебным образом bridge.objectList начнет возвращать действительный объект, но длина того, что возвращается 0. Та же подстановка во втором фрагменте не меняет поведение.

Как я вижу, QObjectList - это просто определение типа для QList<QObject*>, однако файл mo c чувствителен к буквальному имени типа.

У меня вопрос двоякий: я пойду sh, чтобы понять, в чем проблема в моем первом фрагменте, но главная задача - узнать, как использовать массив свойство объектов из Javascript в QWebView.

...