【问题标题】:Integrating c++ and qml集成 c++ 和 qml
【发布时间】:2019-03-15 06:37:45
【问题描述】:

好的,我正在重置整个帖子,因为我想我没有足够的“最小、完整和可验证的示例”,这确实是我的全部问题,因为我对插槽和信号非常迷失..所以这是第二次尝试,我将省略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(我的类花(函数)的标题)

#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()));

这是带有鼠标区域的导航菜单,我希望附加 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: Cannot connect (null)::qmlClick() to (null)::Flower.onClicked()”

对于我的第一篇文章非常具有误导性和混淆表示歉意,我希望这能更清楚地说明我的问题是什么

【问题讨论】:

标签: c++ qt qml


【解决方案1】:

只有 QObject 可以有槽,所以 Flower 必须从 QObject 继承。另一方面,您使用的方法总是会带来问题,即尝试从 C++ 获取 QML 元素,而您必须使用 setContextProperty() 将 C++ 元素导出到 QML:

flower.h

#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__;
}

ma​​in.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();
}

ma​​in.qml

import QtQuick 2.9

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

更多信息我推荐阅读Best Practices for QML and Qt Quick

【讨论】:

  • 您好,谢谢您的回复,非常感谢!我已经实施了您的修复并现在收到此错误“未定义对'vtable for Flower'的引用”
  • @DevinB 删除返回的构建和编译文件夹
  • 非常感谢你帮助我完成了这个@eyllanesc,我做了一个清理工作并且能够运行我的应用程序。我仍然在参考我的 onclick “W libAHDP.so: qrc:/main.qml:258: TypeError: Property 'onClicked' of object QQuickItem(0xd74786a0) is not a function”时遇到错误
  • 我在 onClicked 中有一个小写的 f:flower.onClicked()
  • 两种方式我都收到错误“W libAHDP.so: qrc:/main.qml:257: TypeError: Property 'onClicked' of object [object Object] is not a function”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-08-24
  • 2019-08-17
  • 2021-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多