如何将QQuickitem与Qml对象连接?

时间:2014-03-25 00:00:05

标签: c++ qt qml

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

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->rootObject().findChild<QObject*>("gmailLink");来获取qml对象。 但它不起作用。我想这适合旧的Qt版本。 我怎么能解决这个问题?

2 个答案:

答案 0 :(得分:0)

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

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

喜欢

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

答案 1 :(得分:0)

  1. 您希望在单击图像时调用gmailOpen插槽。除了这样做之外,还有更简单和更好的方法。

    QObject * gmail = view-&gt; rootObject()。findChild(“gmailLink”);

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

  3. 如果您想使用QDesktopServices::openUrl广告位中的gmailOpen打开网址,可以直接通过设置关联属性来调用广告位。

  4. 4,QObject *gmail = view->rootObject().findChild<QObject*>("gmailLink"); ...在设置qml文件之前,您正在尝试获取gmailLink对象的引用。它尚未创建。

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

      5a上。 accounts.h文件


    2. #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
          }
      
      }
      

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

      我。图片来源

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

      III。如果您还没有QtQuick 2.1,可能会导入QtQuick 2.0。