Наличие проблемы, связывающей кнопку QML с классом C++

В первый раз с помощью Ubuntu SDK и QML. Я провел весь день, пытаясь понять это, но каждое решение, через которое я приехал, или устарело или не хорошо зарегистрированное. Я пытаюсь выяснить, как я могу связать свои кнопки в QML к функциям в C++.

Мой класс для моей функции:

#include "terminal_launcher.h"
#include <QProcess>

terminal_launcher::terminal_launcher(QObject *parent) :
    QObject(parent)
{




}

void open_terminal() {
    QProcess proc;
   proc.start("gnome-terminal", QIODevice::ReadWrite);
 }

Мой terminal_launch.h

#ifndef TERMINAL_LAUNCHER_H
#define TERMINAL_LAUNCHER_H

#include <QObject>

class terminal_launcher : public QObject
{
    Q_OBJECT
public:
    explicit terminal_launcher(QObject *parent = 0);

signals:

public slots:

};

#endif // TERMINAL_LAUNCHER_H

Мой main.cpp

    #include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQuickView>
#include <string>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <QString>
#include <QProcess>
#include <QDebug>
//#include "launcher.h"
//#include <QtQml>


int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

        QQuickView view;
        view.setSource(QUrl(QStringLiteral("qrc:///main.qml")));
        view.setResizeMode(QQuickView::SizeRootObjectToView);
   //   qmlRegisterType<Launcher>(uri, 1, 0, "Launcher");
        view.show();

        return app.exec();

}

и наконец мой main.qml

    import QtQuick 2.0
import Ubuntu.Components 1.1

/*!
    \brief MainView with a Label and Button elements.
*/
import QtQuick.LocalStorage 2.0
import QtQuick.Controls 1.1
import QtQuick.Dialogs 1.1
import QtQuick.Window 2.1
import QtQuick.Layouts 1.1
import Ubuntu.Components.Popups 0.1
MainView {
    // objectName for functional testing purposes (autopilot-qt5)
    objectName: "mainView"

    // Note! applicationName needs to match the "name" field of the click manifest
    applicationName: "com.ubuntu.dev.product.productname"

    /*
     This property enables the application to change orientation
     when the device is rotated. The default is false.
    */
    //automaticOrientation: true

    // Removes the old toolbar and enables new features of the new header.
    useDeprecatedToolbar: false

    width: units.gu(100)
    height: units.gu(75)

    Page {
        y: 76
        anchors.rightMargin: 0
        anchors.bottomMargin: 0
        anchors.leftMargin: 0
        title: "Home"
        Column {
            enabled: true
            anchors.rightMargin: 16
            anchors.bottomMargin: 0
            anchors.leftMargin: 16
            anchors.topMargin: 16
            spacing: units.gu(1)
            anchors {
                margins: units.gu(2)
                fill: parent
            }
        }

        Item {
            id: item1
            x: 470
            y: 327
            width: 199
            height: 50
            anchors {
               top: parent.top
               left: parent.left
               right: parent.right
               bottom: parent.bottom
             }
            Action {
                  id: action1
                  text: "Click me"
                  onTriggered: print("action!")
                  iconName: "compose"
              }

            Button {
             //   signal openTerminal()
                id: test_btn
                x: 25
                y: 8
                width: 150
                height: 35
                text: i18n.tr("test")
                checked: false
                iconSource: qsTr("")
                //action: ""

                objectName: "button"
            //   onClicked: print("hmm");
            }
        }



    }
}

Любая справка с этим значительно ценилась бы! Спасибо :)

0
задан 12 January 2015 в 06:11

1 ответ

Насколько я понимаю можно только импортировать объекты, не пустые функции, в QML от C++. Таким образом необходимо сделать Ваш open_terminal функция в метод terminal_launcher, добавьте a terminal_launcher возразите против своего файла QML и затем назовите open_terminal метод в соответствующем месте.

Адаптация Вашего кода следует. Обратите внимание, что я переименовал terminal_launcher кому: TerminalLauncher соответствовать к спокойному стилю.

terminal_launcher.h

#ifndef TERMINAL_LAUNCHER_H
#define TERMINAL_LAUNCHER_H

#include <QObject>
#include <QProcess>

class TerminalLauncher : public QObject
{
    Q_OBJECT

public:
    Q_INVOKABLE void open_terminal();

private:
    QProcess proc;
};

#endif // TERMINAL_LAUNCHER_H

open_terminal теперь метод. Это отмечено как Q_INVOKABLE так, чтобы это могло использоваться от QML. proc был сделан свойством экземпляра для предотвращения его собрал "мусор", когда метод заканчивает выполняться, но дочерний процесс все еще вокруг.

terminal_launcher.cpp

#include "terminal_launcher.h"

void TerminalLauncher::open_terminal() {
    this->proc.start("gnome-terminal", QIODevice::ReadWrite);
}

main.cpp

#include <QGuiApplication>
#include <QQuickView>
#include <QString>
#include <QtQml>
#include "terminal_launcher.h"


int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);
    qmlRegisterType<TerminalLauncher>("com.example.launcher", 1, 0, "Launcher");

    QQuickView view;
    view.setSource(QUrl("main.qml"));
    view.setResizeMode(QQuickView::SizeRootObjectToView);
    view.show();

    return app.exec();
}

Вызов qmlRegisterType очень важно, поскольку это позволяет классу TerminalLauncher быть инстанцированным в QML. Первым аргументом является имя модуля, которое должно быть импортировано. Вторыми и третьим являются номера основной версии и номера вспомогательной версии. Четвертый аргумент является именем который этот класс в известном в QML. Вы, вероятно, хотите сделать это тем же, как это находится в C++, чтобы не управлять собой безумный, но я сделал это отличающимся только, чтобы показать, что это может быть.

main.qml

import QtQuick 2.0
import QtQuick.Controls 1.1
import com.example.launcher 1.0

Rectangle {
    width: 200
    height: 51

    Launcher {
        id: launcher
    }

    Button {
        x: 25
        y: 8
        width: 150
        height: 35
        text: "test"
        onClicked: launcher.open_terminal();
    }
}

Я значительно упростил это для показа соответствующих частей. Обратите внимание, что я инстанцирую a Launcher возразите и затем назовите open_terminal метод, когда Кнопка нажата.

termlaunch.pro

CONFIG += qt
QT += quick
HEADERS = terminal_launcher.h
SOURCES = main.cpp terminal_launcher.cpp
TARGET = termlaunch

Этот файл проекта дает qmake команду создавать названный двоичный файл termlaunch. Все эти файлы должны войти в тот же каталог.

0
ответ дан 3 August 2019 в 19:55

Другие вопросы по тегам:

Похожие вопросы: