Итак, у меня есть собственный класс Foo, который был зарегистрирован как метатип с использованием Q_DECLARE_METATYPE(Foo)
макрос в конце определения класса.
Я могу установить элементы в списке, проверить, если canConvert, но когда я пытаюсь сделать элемент типа Foo во время компиляции.
Используя QVariant, переданный из QModelIndex &index
:
Foo item(index.data(Qt::DisplayRole).value<Foo>())
завершается со следующими ошибками:
no matching function for call to 'namespace::Foo::Foo(namespace::Foo)'
In instantiation of 'T qvariant_cast(const Foo&) [with T = namesapce::Foo]':
required from 'T QVariant::value() const [with T = namespace::Foo]'
no matching function for call to 'namespace::Foo::Foo(const namespace::Foo &)'
no matching function for call to 'namespace::Foo::Foo(const namespace::Foo&)'
no matching function for call to 'namespace::Foo::Foo(const namespace::Foo)'
In member function 'T QVariant::value() const [with T = namespace::Foo]'
все из файла qvariant.h
Что я здесь не так делаю?
Мой класс имеет следующие конструкторы:
Foo::Foo(const Foo &)
Foo::Foo()
Заголовок выглядит следующим образом:
namespace a {
namespace b {
class Foo {
explicit Foo();
explicit Foo(const Foo &a);
...
};
} // b
} // a
Q_DECLARE_METATYPE(a::b::Foo)
Как предложил Дэн Милберн, удалив explicit
ключевые слова решили проблему. Похоже, что неявное преобразование происходило в вызове значения, поэтому наличие только явных конструкторов предотвратило это.
Других решений пока нет …