Интеграция c ++ и qml - PullRequest
       17

Интеграция c ++ и qml

1 голос
/ 15 марта 2019

Хорошо, я сбрасываю весь этот пост, потому что мне кажется, что мне не хватило «Минимального, Полного и Проверяемого примера», который действительно является полным моим вопросом, потому что я просто ПОТЕРЯЛ на слотах и ​​сигналах ...так что вот вторая попытка, я опущу flower.cpp, но знаю, что там есть функция

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQuickView>
#include <QtQuick>
#include <QNetworkAccessManager>
#include <iostream>
#include <QJsonObject>
#include <QJsonArray>
#include <QJsonDocument>
#include <QNetworkReply>
#include <QObject>
#include "flower.h"



void Flower::onClicked(){
//code i've been trying to test all day
}

flower.h (мой заголовок для класса flower (функция))

#ifndef FLOWER_H
#define FLOWER_H

#include <QObject>

class Flower
{
private slots:
void onClicked();

};
#endif // FLOWER_H

main.cpp (это то, откуда запускается мое приложение QML, и я пытаюсь настроить там подключение сигнала и слота)

QQuickView home;
home.setSource(QUrl::fromLocalFile("main.qml"));
home.show();
QObject *homePa = home.rootObject();
QObject *buttF = homePa->findChild<QObject*>("buttFObject");
QObject::connect(buttF, SIGNAL(qmlClick()), buttF,
                 SLOT(Flower.onClicked()));

это navmenu с мышиной областью, котораяЯ хочу прикрепить команду onClicked:

Rectangle {
    signal qmlClick();

    id: navMenu
    color: "#00000000"
    radius: 0
    anchors.fill: parent
    z: 3
    visible: false
    border.width: 0
    transformOrigin: Item.Center
               MouseArea {
                id: buttFArea
                objectName: buttFObject
                anchors.fill: parent
                onClicked: navMenu.qmlClick()
            }
           }

Когда я пытаюсь запустить прямо сейчас, я получаю эту ошибку "W libAHDP.so: QObject :: connect: Невозможно подключиться (null) :: qmlClick ()to (null) :: Flower.onClicked () "

Извиняюсь за то, что мой первый пост был очень вводящим в заблуждение и перепутан. Надеюсь, мне понятнее, в чем заключается моя проблема

1 Ответ

0 голосов
/ 15 марта 2019

Только слоты QObject могут иметь слоты, поэтому Flower должен наследовать от QObject.С другой стороны, вы используете подход, который всегда вызывает проблемы, заключающийся в попытке получить элемент QML из C ++, вместо этого вы должны экспортировать элемент C ++ в QML, используя setContextProperty():

flower.ч

#ifndef FLOWER_H
#define FLOWER_H

#include <QObject>

class Flower : public QObject
{
    Q_OBJECT
public:
    explicit Flower(QObject *parent = nullptr);
    Q_SLOT void onClicked();
};

#endif // FLOWER_H

flower.cpp

#include "flower.h"
#include <QDebug>

Flower::Flower(QObject *parent) : QObject(parent)
{}
void Flower::onClicked()
{
    qDebug()<< __PRETTY_FUNCTION__;
}

main.cpp

#include <QGuiApplication>
#include <QQuickView>
#include <QQmlContext>
#include "flower.h"

int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    QGuiApplication app(argc, argv);
    Flower flower;
    QQuickView view;
    view.rootContext()->setContextProperty("flower", &flower);
    view.setSource(QUrl(QStringLiteral("qrc:/main.qml")));
    view.show();
    return app.exec();
}

main.qml

import QtQuick 2.9

Rectangle {
    color: "#00000000"
    anchors.fill: parent
    transformOrigin: Item.Center
    MouseArea {
        id: buttFArea
        anchors.fill: parent
        onClicked: flower.onClicked()
    }
}

Для получения дополнительной информации я рекомендую прочитать Рекомендации по QML и Qt Quick

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...