Не могу связывать сигнал C ++ с слотом QMLC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Не могу связывать сигнал C ++ с слотом QML

Сообщение Anonymous »

Я пытаюсь связать свой слот, который находится в классе C ++ с файлом QML. У меня есть основной класс, в котором создается мой сигнал, а также мой QML -файл, с которым я хочу связать мой класс C ++, создается только после нажатия кнопки, он открывается через StackView < /p>
Небольшой кусочек кода, говоря о регистрации:

Код: Выделить всё

StackView {
id: stackView
anchors.fill: parent
initialItem: loginPage

Component {
id:loginPage

LoginPage {
onRegisterClicked: {
stackView.push(registrationPage)
}
}
}

Component {
id: registrationPage
RegistrationPage {
onBackButtonClicked: {
stackView.pop()
}
}
}
}
< /code>
Я попробовал несколько реализаций о том, как подключить сигнал и слот в других сообщениях на форуме, но по какой -то причине мне ничего не работает, я также пытался создать новый проект и тест Как это можно сделать там, но для меня ничего не работает, последняя реализация, на которой я установил, выглядит как это 
[b] registrationpage.qml часть кода: [/b] 
Page {
id: registrationPage

property var controller: MainController.regPageController // контроллер RegistrationPageController

Connections {
target: registrationPage.controller
function onMySignal()
{
console.log("asd123")
}
}
< /code>
В то же время, если я просто вызову функций из моего класса C ++, то все будет работать, только сигналы и слоты не работают < /p>
< strong> RegistrationPageController.h  
#ifndef REGISTRATIONPAGECONTROLLER_H
#define REGISTRATIONPAGECONTROLLER_H

#include 
#include "qqml.h"
#include "ServerConnector.h"

class RegistrationPageController : public QObject
{
Q_OBJECT
QML_ELEMENT

public:
explicit RegistrationPageController(ServerConnector& serverConnector_, QObject* parent = nullptr);
~RegistrationPageController();

Q_INVOKABLE void prepareRegistrationRequest(const QString& q_initials, const QString& q_login, const QString& q_phoneNumber, const QString& q_email, const QString& password) const;

signals:
void mySignal();

private:
ServerConnector& serverConnector_;

};

#endif // REGISTRATIONPAGECONTROLLER_H
registrationpagecontroller.cpp

Код: Выделить всё

#include "../../../include/RegistrationPageController.h"

RegistrationPageController::RegistrationPageController(ServerConnector& serverConnector_, QObject* parent)
: QObject(parent)
, serverConnector_(serverConnector_)
{
emit mySignal();
}

RegistrationPageController::~RegistrationPageController()
{
}

void RegistrationPageController::prepareRegistrationRequest(const QString& q_initials, const QString& q_login, const QString& q_phoneNumber, const QString& q_email, const QString& password) const
{}
минимальный воспроизводимый пример
main.cpp

Код: Выделить всё

#include 
#include 
#include 
#include 

int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);

QQmlApplicationEngine engine;

MyClass* myClass = new MyClass();

engine.rootContext()->setContextProperty("qMyClass", myClass);

QObject::connect(
&engine,
&QQmlApplicationEngine::objectCreationFailed,
&app,
[]() { QCoreApplication::exit(-1);  },
Qt::QueuedConnection);
engine.loadFromModule("untitled", "Main");

return app.exec();
}
main.qml

Код: Выделить всё

import QtQuick 2.15
import QtQuick.Window 2.15

Window {
width: 640
height: 480
visible: true

Connections {
target: qMyClass
function onMySignal(){
console.log("123")
}
}
}
myclass.h

Код: Выделить всё

#ifndef MYCLASS_H
#define MYCLASS_H

#include 
#include 

class MyClass : public QObject
{
Q_OBJECT
QML_ELEMENT
public:
explicit MyClass(QObject* parent = nullptr);

signals:
void mySignal();
};

#endif // MYCLASS_H
myclass.cpp

Код: Выделить всё

#include "myclass.h"

MyClass::MyClass(QObject* parent)
: QObject(parent)
{
emit mySignal();
}
Параметры, которые я попробовал

Код: Выделить всё

Connections {
target: qMyClass
onMySignal: {
console.log("123")
}
}
Здесь есть ошибка из -за старой реализации
connect in main.cpp

Код: Выделить всё

QObject::connect(myClass, SIGNAL(mySignal()), engine.rootObjects().at(0)->findChild("window"),
SLOT(onSlot()));
В этом случае он показывает мне: qt.core.qobject.connect: qobject :: connect: не может соединить myclass :: mysignal () к (nullptr) :: onslot ()
взят из другого поста
Component.onCompleted: {
myobj.onSomeSignal.connect(signalHandling)
}
< /code>
В этом случае он ничего не выводит < /p>
Upd 1.0 < /p>
Единственный способ, который я нашел для Слот C ++ для работы с QML - это если слот включен в свойство Q_Property, но до сих пор неясно, как сделать простой слот без q_property, также запускает сигнал в QML

Подробнее здесь: https://stackoverflow.com/questions/793 ... o-qml-slot
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»