App de toque do Ubuntu com interface simples (QMake) - como conectar o C ++ ao QML

2

Tenho notado que o SDK do Ubuntu agora tem um modelo para um 'App with Simple UI (QMake)'. Isso cria um projeto de aplicativo C ++ Ubuntu com uma interface do usuário de amostra contendo um Rótulo e um Botão (Precisa de um Kit 15.04).

O que eu não entendo é como fazer a interface de usuário da QML se comunicar com o código C ++. Tanto quanto eu posso dizer que o arquivo main.qml não se conecta ao código C ++.

Estou tentando portar o aplicativo MythMote para o Ubuntu Touch (veja também meu post anterior Como criar um aplicativo Ubuntu Touch com um backend C ++ e uma interface QML ) e ter um aplicativo C ++ que funcione como um aplicativo de desktop (código abaixo). Para o aplicativo Ubuntu Touch, eu preciso de uma interface QML para interagir com o código C ++. Em resumo: o usuário clica em um botão na interface QML que é conectada a um slot C ++ que envia uma mensagem de texto para a porta MythMote (digamos: socket- > write (key up \ r \ n ")).

Alguém pode me dar uma dica sobre como implementar isso? Não consigo encontrar um exemplo de trabalho para o Ubuntu Touch.

Abaixo está o código (não ganhando um concurso de beleza):

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");
}
    
por RudderDuck 02.01.2015 / 16:00

1 resposta

0

Ao iniciar um novo projeto, você precisa selecionar um dos modelos "Aplicativo QML com plug-in C ++":

Eu pessoalmente prefiro o CMake sobre o qmake, mas qualquer um irá realizar a mesma coisa.

Quando o novo assistente de projeto for concluído, você terminará com um aplicativo que consiste em uma interface QML e um plug-in QML escrito em C ++. Ele também serve como um exemplo funcional que demonstra como invocar slots em QObject classes e passar informações de volta para o código QML.

    
por Nathan Osman 17.06.2015 / 19:23