【问题标题】:How to connect QQuickitem with Qml Object?如何将 QQuickitem 与 Qml 对象连接起来?
【发布时间】:2014-05-02 14:40:52
【问题描述】:

我正在尝试制作一个简单的程序,允许用户通过单击图像连接到特定网站。 这是我的代码:

account.h:

#ifndef ACCOUNTS_H
#define ACCOUNTS_H
#include <QObject>
#include <QUrl>
#include <QDesktopServices>
class accounts : public QObject
{
    Q_OBJECT
public:
    explicit accounts(QObject* parent = 0) : QObject(parent){}
public slots:

void gmailOpen(const QString &msg)
{
    QUrl gmailUrl(msg);
    QDesktopServices::openUrl(gmailUrl);
}
};
#endif // ACCOUNTS_H

main.cpp:

#include <QtGui/QGuiApplication>
#include <QtQuick/QQuickView>
#include <QtQml>
#include "accounts.h"
int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);
    QQuickView *view = new QQuickView;
    QObject *gmail = view->rootObject().findChild<QObject*>("gmailLink");
    accounts *gmailAccount = new accounts;
    QObject::connect(gmail, SIGNAL(gmailSignal(QString)),gmailAccount,SLOT(gmailOpen(QString)));
    view->setSource(QUrl::fromLocalFile("/Users/yudelin/Documents/MyCrazyProjects/Managers4ManyAccounts/main.qml"));
    view->show();
    return app.exec();
}

main.qml:

import QtQuick 2.0

Rectangle {

    width: 360
    height: 360
    color: "silver"

    Image {
        id:gmailLink
        objectName: "gmailLink"
        width: 102
        height: 199
        fillMode: Image.PreserveAspectFit
        source: "...." //the url is too long so I omit it.
        anchors.centerIn: parent
        signal gmaiSignal (string msg)
        MouseArea {
            anchors.fill: parent
            onClicked:
                gmailLink.gmailSignal("http://mail.google.com")
        }
    }

}

如您所见,我正在尝试将 Qml Image 与 c++ 对象帐户连接起来。 所以我使用QObject *gmail = view-&gt;rootObject().findChild&lt;QObject*&gt;("gmailLink"); 来获取qml 对象。 但它不起作用。我想它适合旧的 Qt 版本。 我该如何解决这个问题?

【问题讨论】:

    标签: c++ qt qml


    【解决方案1】:
    1. 您希望在单击图像时调用 gmailOpen 插槽。除了这样做之外,还有更简单和更受欢迎的方法。

      QObject *gmail = view->rootObject().findChild("gmailLink");

    2. 正如@Kunal 指出的,您可以使用Qt.openUrlExternally(string)

    3. 如果你想在gmailOpen槽中使用QDesktopServices::openUrl打开Url,可以通过设置上下文属性直接调用槽。

    4, QObject *gmail = view-&gt;rootObject().findChild&lt;QObject*&gt;("gmailLink");... 在设置 qml 文件之前,您尝试获取 gmailLink 对象的引用。它还没有创建。

    1. 以下代码解释了我对这个问题的看法

      5a。 account.h 文件


    #ifndef ACCOUNTS_H
    #define ACCOUNTS_H
    #include <QObject>
    #include <QUrl>
    #include <QDesktopServices>
    class accounts : public QObject
    {
        Q_OBJECT
    public:
        explicit accounts(QObject* parent = 0) : QObject(parent){}
    public slots:
    
    void gmailOpen(const QString &msg)
    {
        QUrl gmailUrl(msg);
        QDesktopServices::openUrl(gmailUrl);
    }
    };
    #endif // ACCOUNTS_H
    

    5b。 main.cpp 文件


    #include <QtGui/QGuiApplication>
    #include <QtQuick/QQuickView>
    #include <QtQml>
    #include "accounts.h"
    int main(int argc, char *argv[])
    {
        QGuiApplication app(argc, argv);
        accounts *gmailAccount = new accounts;
        QQuickView *view = new QQuickView;
        view->engine()->rootContext()->setContextProperty("accounts",gmailAccount);
        view->setSource(QUrl::fromLocalFile("qml/SO_OpenExternalLink/main.qml"));
        view->show();
        return app.exec();
    }
    
    5c. main.qml file
    

    import QtQuick 2.1
    import QtQuick.Dialogs 1.0
    Rectangle {
        width: 360
        height: 360
        color: "silver"
        Image {
            id:gmailLink
            objectName: "gmailLink"
            width: 102
            height: 199
            fillMode: Image.PreserveAspectFit
            source: "http://upload.wikimedia.org/wikipedia/commons/4/41/Flag_of_India.svg"
            anchors.centerIn: parent
            MouseArea {
                anchors.fill: parent
                onClicked:Qt.openUrlExternally("http://mail.google.com")
            }
        }
        Image{
            id:secondImage
            width:102
            height:199
            fillMode:Image.PreserveAspectFit
            source: "http://upload.wikimedia.org/wikipedia/commons/5/55/Emblem_of_India.svg"
            anchors.left:gmailLink.right
            anchors.top: gmailLink.top
            MouseArea {
                anchors.fill: parent
                onClicked:fileDialog.visible = true
            }
        }
        FileDialog {
            id: fileDialog
            title: "Please choose a file"
            nameFilters: [ "Image files (*.jpg *.png)", "All files (*)" ]
            visible:false;
            selectMultiple:false
            onAccepted:secondImage.source = fileDialog.fileUrl
        }
    
    }
    

    5 天。您需要从上面的代码中更改以下内容

    我。图片来源

    二。 main.cpp中的QML文件路径

    三。如果您还没有 QtQuick 2.1,可以导入 QtQuick 2.0。

    【讨论】:

    • 请注意,如果您有专门用于打开 URL 的帐户类,那么我建议您放弃该类并改用Qt.openUrlExternally(string)
    • 我想为点击操作添加更多功能。所以我想我想绑定 c++ 类和 qml 对象。感谢您帮助修改我的代码。但我有一些关于引擎的问题。是qml控制c++对象的handler吗?
    • view-&gt;engine()-&gt;rootContext()-&gt;setContextProperty("accounts",gmailAccount); 似乎每个 qml 都设置了相同的功能。如果我想让其中一些有自己的特定功能怎么办?
    • 抱歉,我认为我没有正确理解您的问题。 * 如果我想让它们中的一些具有自己的特定功能怎么办*。你能详细解释一下吗?您想创建一个 C++ 类并将其用作 QML 中的新类型吗?请举例说明,以帮助我们帮助您。
    • 如果我在 qml 中创建两个图像,我希望它们都具有不同的功能。例如,我单击图像 1 打开一个新网页,然后单击图像 2 更改其图像。我该怎么办?
    【解决方案2】:

    如果您只想打开 URL,那么您可以直接从 QML 使用Qt.openUrlExternally(string)Here 是文档。无需为此创建 QObject。

    对于您的代码。我没有看到任何名为gmailSignal 的方法。 你应该打电话给gmailOpen

    喜欢

    gmailLink.gmailOpen("http://mail.google.com")
    

    【讨论】:

    • 非常感谢!但我真的很想学习如何将 QML 和 c++ 绑定在一起。这就是我想使用信号和插槽的原因。顺便说一句,我已经声明了 gmailSignal,但是我错过了 l 对不起,让您感到困惑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-02
    • 2018-04-06
    • 2021-02-23
    相关资源
    最近更新 更多