Реализация логики файла .ui в .qml с использованием псевдонима и интеграции C ++ - PullRequest
0 голосов
/ 25 января 2019

Я пытаюсь соединить класс C ++ с QML , но я не могу реализовать логику в отдельном файле qml. Когда я добавляю функциональность непосредственно в файл ui.qml, она работает, но я получаю предупреждение:

Функции не поддерживаются в форме Qt Quick UI

Я пробовал , используя псевдоним , но по какой-то причине он не работает. Вот код:

ReasonsForm.ui.qml:

import QtQuick 2.4
//import io.qt.UserDataProvider 1.0

MenuPage {
id: reasonsPage
property alias myReasons: myReasons

title: qsTrId("reasons")

Description {
    id: reasonsText
    text: qsTrId("reasons-text")
    anchors.bottomMargin: 150
}

//UserDataProvider{id:dataProvider}

MenuTextArea {
    id: myReasons
    text: qsTrId("aa")
    anchors.horizontalCenter: reasonsText.horizontalCenter
    anchors.top: reasonsText.bottom
    width: reasonsText.width
    //this actually works despite the warnings
    //onEditingFinished: dataProvider.saveInput("myReasons", text) 
}

ReasonsForm.qml:

import QtQuick 2.4
import io.qt.UserDataProvider 1.0

ReasonsForm {
    UserDataProvider{id:dataProvider}

    myReasons{
        onEditingFinished: dataProvider.saveInput("myReasons", text)
    }
}

Компилятор ни о чем не скулит, но метод из dataProvider вообще не вызывается. Любая помощь очень ценится.

РЕДАКТИРОВАТЬ: я нашел обходной путь, но он все еще не объясняет, почему код не работает. Способ заставить это работать без файла qml добавляет

Connections {   
        target: myReasons
        onEditingFinished: dataProvider.saveInput("myReasons", myReasons.text)
    }

в файл пользовательского интерфейса. Я хотел бы отделить логику от пользовательского интерфейса.

РЕДАКТИРОВАТЬ II: Я что-то неправильно понимаю? Похоже, псевдонимы вообще не работают для меня. Вот простой пример, который ничего не делает (кнопка ничего не делает): enter image description here

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Я все-таки смог это исправить. Проблема заключалась в том, что я предполагал, что при наличии файлов ui.qml и .qml они уже были подключены (nameForm.ui.qml и name.qml). Что нужно сделать, это использовать файл .qml для отображения элементов и поместить внутрь .ui.qml, так что все, что мне нужно сделать в моем случае, это отобразить / включить файл ReasonsForm.qml, где я хочу содержимое пользовательского интерфейса. файл тоже, так как пользовательский интерфейс уже отображается в qml, как это:

ReasonsForm {...

Я отображал ReasonsForm.ui.qml, предполагая, что это графический интерфейс, который должен использоваться в качестве основного элемента для отображения в main.qml или макете стека, а ReasonsForm.qml - просто дополнительная логика. Однако сначала нужно отобразить qml.

0 голосов
/ 25 января 2019

Вот полный пример использования C ++ в QML. main.qml

import QtQuick 2.12
import QtQuick.Window 2.12
import Proxy 1.0

Window {
   visible: true
   width: 640
   height: 480
   title: qsTr("Hello World")

   Proxy {
      id : proxy
   }

   Component.onCompleted: {
      var test = "Hello C++ from QML";
      proxy.call( test );
   }
}

proxy.h

#ifndef _proxy_h_
#define _proxy_h_

#include <QObject>
#include <QVariant>

class Proxy : public QObject
{
   Q_OBJECT

public :
   Proxy();
   virtual ~Proxy() {}

   Q_INVOKABLE void call( QVariant );
};

#endif

proxy.cpp

#include "proxy.h"
#include <QGuiApplication>
#include <QQmlEngine>

Proxy::Proxy() {}

void Proxy::call( QVariant in )
{
   qInfo("C++ : %s", in.toString().toStdString().c_str());
}

static void registerProxy()
{
   qmlRegisterType<Proxy>("Proxy", 1, 0, "Proxy");
}

Q_COREAPP_STARTUP_FUNCTION(registerProxy);

CMakeLists.txt

cmake_minimum_required(VERSION 3.1)

project(test_proxy LANGUAGES CXX)

set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

find_package(Qt5 COMPONENTS Core Quick REQUIRED)

add_executable(${PROJECT_NAME} "main.cpp" "qml.qrc" proxy/proxy.h proxy/proxy.cpp )
target_compile_definitions(${PROJECT_NAME} PRIVATE $<$<OR:$<CONFIG:Debug>,$<CONFIG:RelWithDebInfo>>:QT_QML_DEBUG>)
target_link_libraries(${PROJECT_NAME} PRIVATE Qt5::Core Qt5::Quick)
...