带简单UI的Ubuntu Touch App(QMake) – 如何将C ++连接到QML

我注意到Ubuntu SDK现在有一个“带有简单UI的应用程序(QMake)”的模板。 这将创建一个C ++ Ubuntu应用程序项目,其中包含一个包含Label和Button的示例UI(需要一个15.04 Kit)。

我不明白的是如何让QML用户界面与C ++代码进行通信。 据我所知,main.qml文件没有连接到C ++代码。

我正在尝试将MythMote应用程序移植到Ubuntu Touch(另请参阅我之前的文章如何使用C ++后端和QML接口创建Ubuntu Touch应用程序 )并拥有一个可用作桌面应用程序的C ++应用程序(下面的代码)。 对于Ubuntu Touch应用程序,我需要一个QML接口来与C ++代码进行交互。 简而言之:用户单击QML接口上的一个按钮,该接口连接到C ++插槽,该插槽将文本消息发送到MythMote端口(例如:socket-> write(key up \ r \ n“))。

有人可以给我一个如何实现这个的提示吗? 我找不到Ubuntu Touch的工作示例。

以下是代码(未赢得选美比赛):

main.cpp中

#include "mainwindow.h" #include  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  #include  #include  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"); } 

启动新项目时,您需要选择“QML App with C ++ plugin”模板之一:

在此处输入图像描述

我个人更喜欢CMake而不是qmake,但是任何一个都会做同样的事情。

当新项目向导完成时,您将得到一个由QML接口和用C ++编写的QML插件组成的应用程序。 它还作为一个function示例演示了如何在QObject类中调用插槽并将信息传递回QML代码。