Е
Size: a a a
МВ
МВ
RL
Е
import QtQuick 2.15
import QtQuick.Window 2.15
import QtQuick.Controls 2.12
import QtQuick.Dialogs 1.2
ApplicationWindow {
visible: true
width: 640
height: 480
title: qsTr("Hello World")
FileDialog {
id: fileChooser
}
Button {
anchors.centerIn: parent
width: parent.width/2
height: 200
text:"Click"
onClicked: {
fileChooser.open()
}
}
}
AS
struct IDataProvider {никаких версий в макросах
QML_INTERFACE
public:
virtual ~IDataProvider();
virtual void doSomething() = 0;
};
Q_DECLARE_INTERFACE(IDataProvider, "my.IDataProvider")
F
import QtQuick 2.15
import QtQuick.Window 2.15
import QtQuick.Controls 2.12
import QtQuick.Dialogs 1.2
ApplicationWindow {
visible: true
width: 640
height: 480
title: qsTr("Hello World")
FileDialog {
id: fileChooser
}
Button {
anchors.centerIn: parent
width: parent.width/2
height: 200
text:"Click"
onClicked: {
fileChooser.open()
}
}
}
ПК
struct IDataProvider {никаких версий в макросах
QML_INTERFACE
public:
virtual ~IDataProvider();
virtual void doSomething() = 0;
};
Q_DECLARE_INTERFACE(IDataProvider, "my.IDataProvider")
qmlRegisterInterface
функции:QT_DEPRECATED_VERSION_X_5_15("Use qmlRegisterInterface(uri, versionMajor) instead")
AS
qmlRegisterInterface
функции:QT_DEPRECATED_VERSION_X_5_15("Use qmlRegisterInterface(uri, versionMajor) instead")
ПК
qmlRegisterInterface
писать не обязательно, достаточно только Q_DECLARE_INTERFACE
чтоб юзать из QML можно было?AS
qmlRegisterInterface
писать не обязательно, достаточно только Q_DECLARE_INTERFACE
чтоб юзать из QML можно было?ПК
AS
// main.cpp
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QDebug>
struct IDataProvider
{
QML_INTERFACE
public:
virtual ~IDataProvider() {}
virtual void doSomething() = 0;
};
Q_DECLARE_INTERFACE(IDataProvider, "IDataProvider");
class DataProvider : public QObject, public IDataProvider
{
Q_OBJECT
Q_INTERFACES(IDataProvider)
public:
DataProvider(QObject *parent = nullptr)
: QObject(parent)
{}
// IDataProvider interface
public:
virtual void doSomething() override {}
};
class DataProviderUser : public QObject
{
Q_OBJECT
Q_PROPERTY(IDataProvider* dataProvider READ dataProvider WRITE setDataProvider NOTIFY dataProviderChanged)
IDataProvider* m_dataProvider = nullptr;
public:
DataProviderUser(QObject *parent = nullptr)
: QObject(parent)
{}
IDataProvider* dataProvider() const
{
return m_dataProvider;
}
public slots:
void setDataProvider(IDataProvider* dataProvider)
{
qDebug() << "setDataProvider";
if (m_dataProvider == dataProvider)
return;
m_dataProvider = dataProvider;
emit dataProviderChanged(m_dataProvider);
}
signals:
void dataProviderChanged(IDataProvider* dataProvider);
};
int main(int argc, char *argv[])
{
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QGuiApplication app(argc, argv);
qmlRegisterType<DataProvider>("My", 1, 0, "DataProvider");
qmlRegisterType<DataProviderUser>("My", 1, 0, "DataProviderUser");
qmlRegisterInterface<IDataProvider>("IDataProvider");
QQmlApplicationEngine engine;
const QUrl url(QStringLiteral("qrc:/main.qml"));
QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
&app, [url](QObject *obj, const QUrl &objUrl) {
if (!obj && url == objUrl)
QCoreApplication::exit(-1);
}, Qt::QueuedConnection);
engine.load(url);
return app.exec();
}
#include "main.moc"
import QtQuick 2.12
import QtQuick.Window 2.12
import My 1.0
Window {
visible: true
width: 640
height: 480
title: qsTr("Hello World")
DataProvider {
id: provider
}
DataProviderUser {
dataProvider: provider
}
}
AS
Q_DECLARE_INTERFACE(IDataProvider, "IDataProvider");
class DataProvider : public QObject, public IDataProvider
{
Q_OBJECT
Q_INTERFACES(IDataProvider)
DataProvider {
id: provider
}
DataProviderUser {
dataProvider: provider // <<<<<<<<
}
AS
ПК
// main.cpp
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QDebug>
struct IDataProvider
{
QML_INTERFACE
public:
virtual ~IDataProvider() {}
virtual void doSomething() = 0;
};
Q_DECLARE_INTERFACE(IDataProvider, "IDataProvider");
class DataProvider : public QObject, public IDataProvider
{
Q_OBJECT
Q_INTERFACES(IDataProvider)
public:
DataProvider(QObject *parent = nullptr)
: QObject(parent)
{}
// IDataProvider interface
public:
virtual void doSomething() override {}
};
class DataProviderUser : public QObject
{
Q_OBJECT
Q_PROPERTY(IDataProvider* dataProvider READ dataProvider WRITE setDataProvider NOTIFY dataProviderChanged)
IDataProvider* m_dataProvider = nullptr;
public:
DataProviderUser(QObject *parent = nullptr)
: QObject(parent)
{}
IDataProvider* dataProvider() const
{
return m_dataProvider;
}
public slots:
void setDataProvider(IDataProvider* dataProvider)
{
qDebug() << "setDataProvider";
if (m_dataProvider == dataProvider)
return;
m_dataProvider = dataProvider;
emit dataProviderChanged(m_dataProvider);
}
signals:
void dataProviderChanged(IDataProvider* dataProvider);
};
int main(int argc, char *argv[])
{
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QGuiApplication app(argc, argv);
qmlRegisterType<DataProvider>("My", 1, 0, "DataProvider");
qmlRegisterType<DataProviderUser>("My", 1, 0, "DataProviderUser");
qmlRegisterInterface<IDataProvider>("IDataProvider");
QQmlApplicationEngine engine;
const QUrl url(QStringLiteral("qrc:/main.qml"));
QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
&app, [url](QObject *obj, const QUrl &objUrl) {
if (!obj && url == objUrl)
QCoreApplication::exit(-1);
}, Qt::QueuedConnection);
engine.load(url);
return app.exec();
}
#include "main.moc"
import QtQuick 2.12
import QtQuick.Window 2.12
import My 1.0
Window {
visible: true
width: 640
height: 480
title: qsTr("Hello World")
DataProvider {
id: provider
}
DataProviderUser {
dataProvider: provider
}
}
qmlRegisterInterface<IDataProvider>("DataModule.IDataProvider", 1);
AS
qmlRegisterInterface<IDataProvider>("IDataProvider", 1);
ПК
qmlRegisterInterface<IDataProvider>("IDataProvider", 1);
Q_GADGET
AS
Q_GADGET