Приложение 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");
}
1 ответ
При запуске нового проекта вам нужно выбрать один из шаблонов "Приложение QML с плагином C++":
Я лично предпочитаю CMake, а не qmake, но любой из них сделает то же самое.
Когда новый мастер проекта завершит работу, вы получите приложение, состоящее из интерфейса QML и плагина QML, написанного на C++. Он также служит функциональным примером, который демонстрирует, как вызывать слоты в QObject
классы и передавать информацию обратно в код QML.