Я наблюдаю очень странное поведение в 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.