Вызов функций c++ из qml

212
28 июля 2018, 07:00

Подскажите что делаю не так. Написал простую функцию которую хочу вызвать в qml.

Header:

class BackEnd : public QObject
{
  Q_OBJECT
 public:
  explicit BackEnd(QObject *parent = nullptr);
  void shutDown();
signals:
private:
};

cpp:

BackEnd::BackEnd(QObject *parent) :
QObject(parent)
{
}
void BackEnd::shutDown()
{
  string syscol = "shutdown /s /t 0";
  system(syscol.c_str());
}

В main зарегистрировал тип

qmlRegisterType("io.backend", 1, 0, "BackEnd");

Внутри файла qml я могу вызвать BackEnd но функцию shotDown не могу, что не так в написанном коде ?

Answer 1

Надо чтоб она попала в moc файл:

class BackEnd : public QObject
{
    Q_OBJECT
public:
    explicit BackEnd(QObject *parent = nullptr);
    Q_INVOKABLE void shutDown();
...
}

** UPD ** Согласен с товарищем ixSci, если метод как слот не нужен, лучше Q_INVOKABLE написать

Answer 2

Для того, чтобы было видно данную функцию необходимо добавить Q_INVOKABLE перед декларацией функции в заголовке:

class BackEnd : public QObject
{
  Q_OBJECT

public:
  explicit BackEnd(QObject *parent = nullptr);
  Q_INVOKABLE void shutDown();
signals:
private:
};

Ну и для полной красоты стоит изменить свой main :

int main(int argc, char** argv)
{
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
qmlRegisterType<BackEnd>("io.backend", 1, 0, "BackEnd");
BackEnd backEnd;
QQmlContext* cntx = engine.rootContext();
cntx->setContextProperty("backEnd", &backEnd);
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
return app.exec();
}
READ ALSO
Как запустить QTimer в QtConcurrent::run

Как запустить QTimer в QtConcurrent::run

Kак запустить запустить QTimer в QtConcurrent::run?

170
Приложение падает на вызове DeviceIoControl

Приложение падает на вызове DeviceIoControl

Необходимо получить смещение разделов жёсткого дискаЯ делаю это следующим образом:

190
Как работает валидатор ввода в данном методе?

Как работает валидатор ввода в данном методе?

Пытаюсь понять, как работает данное решение с валидатором (вложенный в 'do' while)Никак не могу понять порядок исполнения кода

187
Загрузка файлов в удаленную MongoDB GridFS

Загрузка файлов в удаленную MongoDB GridFS

Нужно записывать метаданные и большие файлы в удаленную MongoDBИзвестен адрес сервера с монгой

140