Приложение Ubuntu Touch с простым пользовательским интерфейсом (QMake) - как подключить C ++ к QML

Я заметил, что в Ubuntu SDK теперь есть шаблон для «Приложения с простым пользовательским интерфейсом (QMake)». Это создает проект приложения C ++ Ubuntu с примером пользовательского интерфейса, содержащим метку и кнопку (необходим комплект 15.04).

Чего я не понимаю, так это как пользовательский интерфейс QML взаимодействует с кодом C ++. Насколько я могу судить, файл main.qml не соединяется с кодом C ++.

Я пытаюсь перенести приложение MythMote на Ubuntu Touch (см. Также мой предыдущий пост Как создать приложение Ubuntu Touch с бэкэндом C ++ и интерфейсом QML ) и иметь приложение C ++, которое работает как настольное приложение (код ниже). Для приложения Ubuntu Touch мне нужен интерфейс QML для взаимодействия с кодом C ++. Вкратце: пользователь нажимает кнопку на интерфейсе QML, который подключен к слоту C ++, который отправляет текстовое сообщение на порт MythMote (скажем: socket-> write (key up \ r \ n ")).

Может ли кто-нибудь дать мне совет о том, как это реализовать? Я не могу найти рабочий пример для Ubuntu Touch.

Ниже приведен код (без победы в конкурсе красоты):

main.cpp

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTcpSocket>
#include <QDebug>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:

    void on_right_clicked();
    void on_left_clicked();
    void on_info_clicked();
    void on_up_clicked();
    void on_guide_clicked();
    void on_square_clicked();
    void on_cancel_clicked();
    void on_down_clicked();
    void on_menu_clicked();
    void on_tv_plus_clicked();
    void on_tv_back_clicked();
    void on_tv_minus_clicked();
    void on_rec_clicked();
    void on_stop_clicked();
    void on_pause_clicked();
    void on_play_clicked();
    void on_skipbk_clicked();
    void on_rw_clicked();
    void on_ff_clicked();
    void on_skipfw_clicked();
    void on_speaker_plus_clicked();
    void on_speaker_off_clicked();
    void on_speaker_minus_clicked();

private:
    Ui::MainWindow *ui;

private:
    QTcpSocket *socket;
};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    socket = new QTcpSocket(this);
    socket->connectToHost("192.168.178.23",6546);
    if(socket->waitForConnected(3000))
        ui->statusBar->showMessage("connected");
    else
        ui->statusBar->showMessage("not connected");
}

MainWindow::~MainWindow()
{
    socket->close();
    delete ui;
}

void MainWindow::on_info_clicked()
{
    socket->write("key i\r\n");
}

void MainWindow::on_up_clicked()
{
    socket->write("key up\r\n");
}

void MainWindow::on_guide_clicked()
{
    socket->write("key s\r\n");
}

void MainWindow::on_left_clicked()
{
    socket->write("key left\r\n");
}

void MainWindow::on_square_clicked()
{
    socket->write("key enter\r\n");
}

void MainWindow::on_right_clicked()
{
    socket->write("key right\r\n");
}

void MainWindow::on_cancel_clicked()
{
    socket->write("key escape\r\n");
}

void MainWindow::on_down_clicked()
{
    socket->write("key down\r\n");
}

void MainWindow::on_menu_clicked()
{
    socket->write("key m\r\n");
}

void MainWindow::on_tv_plus_clicked()
{
    socket->write("play channel up\r\n");
}

void MainWindow::on_tv_back_clicked()
{
    socket->write("key h\r\n");
}

void MainWindow::on_tv_minus_clicked()
{
    socket->write("play channel down\r\n");
}

void MainWindow::on_speaker_plus_clicked()
{
    socket->write("key ]\r\n");
}

void MainWindow::on_speaker_off_clicked()
{
    socket->write("key |\r\n");
}

void MainWindow::on_speaker_minus_clicked()
{
    socket->write("key []\r\n");
}

void MainWindow::on_rec_clicked()
{
    socket->write("key r\r\n");
}

void MainWindow::on_stop_clicked()
{
    socket->write("play stop\r\n");
}

void MainWindow::on_pause_clicked()
{
    socket->write("play speed pause\r\n");
}

void MainWindow::on_play_clicked()
{
    socket->write("play speed normal\r\n");
}

void MainWindow::on_skipbk_clicked()
{
    socket->write("key home\r\n");
}

void MainWindow::on_rw_clicked()
{
    socket->write("play seek backward\r\n");
}

void MainWindow::on_ff_clicked()
{
    socket->write("play seek forward\r\n");
}

void MainWindow::on_skipfw_clicked()
{
    socket->write("key end\r\n");
}
2
задан 13 April 2017 в 15:24

1 ответ

При запуске нового проекта необходимо выбрать одно из "Приложения QML с шаблонами" плагина C++:

enter image description here

я лично предпочитаю CMake по qmake, но любой выполнит то же самое.

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

0
ответ дан 13 April 2017 в 15:24

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

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