Просто наткнулся на странное поведение Qt-фреймворка, вызывая перегруженные методы C++ из Qml и пытаясь понять причину этого. Скажем, у меня есть QList<QVariant>
-как класс со следующими методами:Qt/Qml и перегрузки методов
...
Q_SLOT void append(const QVariant &item);
Q_SLOT void append(const QVariantList &items);
Q_SLOT void insert(int index, const QVariant &item);
Q_SLOT void insert(int index, const QVariantList &items);
...
QML:
onclicked: {
var itemCount = myListObject.size();
myListObject.insert(itemCount, "Item " + (itemCount + 1));
}
Qt как-то решает вызвать перегрузку void insert(int index, const QVariantList &items)
с items
аргументом, равным
пустой null QVariant
QVariantList
вместо void insert(int index, const QVariant &item)
перегрузка с QString
, завернутая в QVariant
.
Теперь, если изменить порядок заявлений следующим образом, она работает, как ожидалось:
Q_SLOT void insert(int index, const QVariantList &items);
Q_SLOT void insert(int index, const QVariant &item);
Я не мог найти что-либо по документации Qt фреймворки о порядке заявлений и как это влияет на то методу разрешенные во время вызова.
Может кто-нибудь объяснить это? Спасибо.
Можете ли вы упомянуть, что конкретно в системе перегрузки javascript вызывают это поведение? – UmNyobe
спасибо за попытку..Я не искал решения ... решение простое - просто измените порядок объявлений ... Я пытался понять (для дальнейшего использования) о том, как и почему Qt решает вызвать неправильную перегрузку и просто полностью игнорирует типы данных. При изменении заказа, однако, у него нет проблемы с решением правильных сигнатур методов. С другой стороны, ваше решение ограничивает мой класс принятием только определенных типов данных. – gplusplus
Действительно, это не отвечает на главный вопрос, т. Е. * Почему * происходит поведение. Глядя на это [old commit] (https://qt.gitorious.org/qt/tmartsums-qt/commit/1d7b672fd46abab51a0124ad19aad18e5d14f1a8), нет (очевидной) причины, по которым он не работает. Ошибка ?? – BaCaRoZzo