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

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

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

我不明白如何让 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 的有效示例。

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

主程序

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

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

    return a.exec();
}

主窗口

#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

主窗口.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

当开始一个新项目时,您需要选择其中一个“带有 C++ 插件的 QML App”模板:

在此处输入图片描述

我个人更喜欢 CMake 而不是 qmake,但两者都可以完成相同的事情。

新项目向导完成后,您将得到一个由 QML 界面和用 C++ 编写的 QML 插件组成的应用程序。它还可以作为一个功能示例,演示如何调用QObject类中的插槽并将信息传回 QML 代码。

相关内容