Q_GADGET Неизвестный тип возвращаемого значения метода

У меня есть класс MyWindow. Этот вызов класса

MyWindow.h

class MyWindow : public QObject
{
   Q_OBJECT
   Q_PROPERTY(int nbMatch READ GetNbMatch NOTIFY matchChangedQMLL)

public:
   explicit MyWindow(QObject *parent = nullptr);
   explicit MyWindow(AsyncCalendarGetter& calendar, QObject *parent = nullptr);
   ~MyWindow();

   Q_INVOKABLE QString getFirstMatch() {
    return QString::fromUtf8(calendar->GetCalendar().front().GetDate().toString().c_str());
   }

   Q_INVOKABLE Date getFirstDate() {
    return calendar->GetCalendar().front().GetDate();
   }

   // ...
}

Date.h

#pragma once

#include <string>
#include <sstream>
#include <QObject>
#include <iostream>

class Date
{
   Q_GADGET
   Q_PROPERTY(std::string dateStr READ toString)
public:
   Date(std::string&& str);
   Date();
   Date(int day, int month, int year, int h, int m);

   friend std::ostream& operator<<(std::ostream& os, const Date& obj);

   Q_INVOKABLE std::string toString() const {
    std::stringstream ss;
    ss << *this;
    return ss.str();
   }

private:
  int day = 1;
  int month = 1;
  int year = 1970;
  int h = 0;
  int m = 0;
};

Когда я вызываю первую функцию getFirstMatch в моем QML, она работает. Но вторая функция gtFirstDate не работает, у меня сообщение об ошибке:

qrc:/main.qml:27: Ошибка: Неизвестный тип возврата метода: Дата

Мой QML

 Connections {
    target: mainmywindow
    onMatchChangedQMLL: {
        lbl0.text = "" + Number(mainmywindow.nbMatch) + " -> " + qsTr(mainmywindow.getFirstMatch()) // WORKS
        lbl1.text = "" + Number(mainmywindow.nbMatch) + " -> " + qsTr(mainmywindow.getFirstDate().toString()) // DOES NOT WORK
    }
 }

У кого-то есть идея?

Спасибо

1 ответ

Решение

Вы можете найти информацию о Q_DECLARE_METATYPE Вот:

https://doc.qt.io/qt-5/qmetatype.html

В соответствии с ним вы должны выполнить следующие шаги, чтобы решить вашу проблему:

  1. Добавить Q_DECLARE_METATYPE(Date) после объявления Date
  2. Добавить qRegisterMetaType<Date>(); где-то раньше engine.load(url);

(Я полагаю, у вас есть QQmlApplicationEngine engine; в main() для загрузки и запуска QML)

Обновление: Такжеstd::string не поддерживается напрямую QML, вы должны использовать QString

Другие вопросы по тегам