Size: a a a

2020 July 11

Е

Егор in Qt
FPOHTMEH
А есть возможность скрин скинуть? Какая версия Qt, IDE ?
Скрин с андроида? Через минут 10 разве что
источник

F

FPOHTMEH in Qt
Егор
Скрин с андроида? Через минут 10 разве что
спс
источник

МВ

Макс Воробьев... in Qt
+ можно делить на насколько сторибоардов
источник

МВ

Макс Воробьев... in Qt
xaml немного потрогал - как-то не зашло
источник

RL

Roman Levkovych𓅝 in Qt
Макс Воробьев
с одной стороны - подвисают и нужен большой экран для разраба. с другой - переходы наглядно
потому их лучше использовать как просто удобное логическое разделение экранов. А навигация (особенно когда надо вернуться из одного сториборда в другой) — хороша когда аппликация мала. Но это оффтоп немного
источник

Е

Егор in Qt
FPOHTMEH
спс
Ну собственно вот
Версия кутей 5.15.0
Андроид 8.1.0
NDK 21.1.6.6352462
SDK 29
jdk 1.8.0__251
Код воть
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

Anatoly Shirokov in Qt
хм, думал знаю причину, фиг:
struct IDataProvider {
   QML_INTERFACE
public:
   virtual ~IDataProvider();
   virtual void doSomething() = 0;
};
Q_DECLARE_INTERFACE(IDataProvider, "my.IDataProvider")
никаких версий в макросах
источник

F

FPOHTMEH in Qt
Егор
Ну собственно вот
Версия кутей 5.15.0
Андроид 8.1.0
NDK 21.1.6.6352462
SDK 29
jdk 1.8.0__251
Код воть
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()
       }
   }
}
большое спасибо
источник

ПК

Побитый Кирпич... in Qt
Anatoly Shirokov
хм, думал знаю причину, фиг:
struct IDataProvider {
   QML_INTERFACE
public:
   virtual ~IDataProvider();
   virtual void doSomething() = 0;
};
Q_DECLARE_INTERFACE(IDataProvider, "my.IDataProvider")
никаких версий в макросах
Ты похоже о другом говоришь. Я говорил о qmlRegisterInterface функции:
https://doc.qt.io/qt-5/qqmlengine.html#qmlRegisterInterface
Эта перегрузка помечена как deprecated:
QT_DEPRECATED_VERSION_X_5_15("Use qmlRegisterInterface(uri, versionMajor) instead")
источник

AS

Anatoly Shirokov in Qt
Побитый Кирпич
Ты похоже о другом говоришь. Я говорил о qmlRegisterInterface функции:
https://doc.qt.io/qt-5/qqmlengine.html#qmlRegisterInterface
Эта перегрузка помечена как deprecated:
QT_DEPRECATED_VERSION_X_5_15("Use qmlRegisterInterface(uri, versionMajor) instead")
Нет, макрос Q_DECLARE_INTERFACE играет туже роль и там нет версии
источник

ПК

Побитый Кирпич... in Qt
Anatoly Shirokov
Нет, макрос Q_DECLARE_INTERFACE играет туже роль и там нет версии
Хочешь сказать, что qmlRegisterInterface писать не обязательно, достаточно только Q_DECLARE_INTERFACE чтоб юзать из QML можно было?
источник

AS

Anatoly Shirokov in Qt
Побитый Кирпич
Хочешь сказать, что qmlRegisterInterface писать не обязательно, достаточно только Q_DECLARE_INTERFACE чтоб юзать из QML можно было?
Да
источник

ПК

Побитый Кирпич... in Qt
Ок, через некоторое время проверю
источник

AS

Anatoly Shirokov in Qt
Побитый Кирпич
Ок, через некоторое время проверю
вообщем, как-то хитро с этой регистрация интерфейса, вот только в такой конфигурации я заставить работать QML:
// 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"

main.qml:
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

Anatoly Shirokov in Qt
без
Q_DECLARE_INTERFACE(IDataProvider, "IDataProvider");

class DataProvider : public QObject, public IDataProvider
{
   Q_OBJECT
   Q_INTERFACES(IDataProvider)

QML не понимает этого присвоения:
 DataProvider {
       id: provider
   }

   DataProviderUser {
       dataProvider: provider // <<<<<<<<
   }
источник

AS

Anatoly Shirokov in Qt
но и qmlRegisterInterface<IDataProvider>("IDataProvider"); требуется
источник

ПК

Побитый Кирпич... in Qt
Anatoly Shirokov
вообщем, как-то хитро с этой регистрация интерфейса, вот только в такой конфигурации я заставить работать QML:
// 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"

main.qml:
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);

Но скорее всего uri тут неправильный, хоть и работает всё. ПОэтому и спросил какая у uri в этом методе природа
источник

AS

Anatoly Shirokov in Qt
а если использовать новую версию, то не компилируется:
qmlRegisterInterface<IDataProvider>("IDataProvider", 1);
источник

ПК

Побитый Кирпич... in Qt
Anatoly Shirokov
а если использовать новую версию, то не компилируется:
qmlRegisterInterface<IDataProvider>("IDataProvider", 1);
Я вместо QML_INTERFACE сделал Q_GADGET
источник

AS

Anatoly Shirokov in Qt
Побитый Кирпич
Я вместо QML_INTERFACE сделал Q_GADGET
а, ты сделал лайт Q_OBJECT
источник