В первый раз с помощью 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");
}
}
}
}
Любая справка с этим значительно ценилась бы! Спасибо :)
Насколько я понимаю можно только импортировать объекты, не пустые функции, в 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
. Все эти файлы должны войти в тот же каталог.