我正在尝试创建一个简单的程序,允许用户通过单击图像连接到特定网站。 这是我的代码:
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版本。
我怎么能解决这个问题?
答案 0 :(得分:0)
如果您只想打开网址,则可以直接从QML使用Qt.openUrlExternally(string)
。 Here是文档。无需为此创建QObject。
并为您的代码。我没有看到任何名为gmailSignal
的方法。
你应该打电话给gmailOpen
。
喜欢
gmailLink.gmailOpen("http://mail.google.com")
答案 1 :(得分:0)
您希望在单击图像时调用gmailOpen插槽。除了这样做之外,还有更简单和更好的方法。
QObject * gmail = view-&gt; rootObject()。findChild(“gmailLink”);
正如@Kunal指出的那样,您可以使用Qt.openUrlExternally(string)
。
如果您想使用QDesktopServices::openUrl
广告位中的gmailOpen
打开网址,可以直接通过设置关联属性来调用广告位。
4,QObject *gmail = view->rootObject().findChild<QObject*>("gmailLink");
...在设置qml文件之前,您正在尝试获取gmailLink
对象的引用。它尚未创建。
以下代码解释了我对问题的看法
5a上。 accounts.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
}
}
5D。您需要从上面的代码中更改以下内容
我。图片来源
II。 main.cpp中的QML文件路径
III。如果您还没有QtQuick 2.1,可能会导入QtQuick 2.0。