C ++信号和访问QtQuick项目

时间:2015-05-04 12:29:23

标签: c++ qt

我正在尝试编写一个QtQuick程序,它可以作为用户和一些CLI应用程序之间的智能接口。我已经实现了QtQuick + JavaScript应用程序。

QtQuick butten发出由C ++层监听的信号。到目前为止一切运作良好。

但是,在我的C ++ slot 函数中,我需要在QtQuick应用程序中写入某个Item。此Item是TextArea,用作CLI应用程序的日志输出。这些CLI应用程序从C ++中的 slot 函数运行。我将它们的输出存储到变量中,我想在此Log输出TextArea中显示此变量的输出。

我尝试了很多东西,但我找不到正确的方法

2 个答案:

答案 0 :(得分:2)

我遇到了类似的问题。 这就是我解决它的方法。

在C ++中,我创建了一个用QProcess处理命令的类(我将类暴露给QML),它将readyToRead信号附加到我公开的类中的C ++函数,此函数发出另一个信号 showOutput < / strong>输出文字。

有了这些信息,我只需将我的新信号连接到qml中的javascript函数:

cppExposed.showOutput.connect(jsFunction);

在javascript函数中,我只需附加文本

function jsFunction(output) {
    OutputTextArea.text += output;
}

要将C ++属性公开给QML,您可以查看以下文档:http://doc.qt.io/qt-5/qtqml-cppintegration-exposecppattributes.html

我认为最简单的方法是创建cpp类的对象,并在加载main.qml之前在main.cpp中设置为context属性: 像这样:

QQmlApplicationEngine engine;
ProcessHandler procHandler;
engine.rootContext()->setContextProperty("procHandler", &procHandler);

现在您可以直接从QML访问对象,并且可以连接信号

procHandler.showOutput.connect(jsFunction)

在你的C ++课程中,不要忘记连接过程ReadyToReady信号并用数据发出你自己的信号:

void readyToRead() {
    emit showOutput(m_proc.readAllStandardOutput());
}

更新: 在引擎加载QML文件之前,应该设置您的属性:

AnalyzeSignal analyzeSignal;
engine.rootContext()->setContextProperty("analyzeSignal", &analyzeSignal);
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

我认为你不需要 writeToLogOutput 作为属性(并且它有一些语法错误btw),它是一种信号方法,对吧?所以QML可以自动作为信号使用,而不是属性。

请勿创建新的QQMLContext。 在这一行中你正在做的是创建一个新的QQMLContext

QQmlContext *context = new QQmlContext(engine.rootContext());
context->setContextProperty("analyzeSignal", &analyzeSignal);

这不起作用,因为您将属性设置为新创建的上下文,而不是原始根上下文。

答案 1 :(得分:0)

我对main函数的最终解决方案如下:

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QQmlApplicationEngine engine;

    AnalyzeSignal analyzeSignal;
    QQmlContext *context = engine.rootContext();
    context->setContextProperty("analyzeSignal", &analyzeSignal);

    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

    // Registering slot onto a signal
    QObject *win = engine.rootObjects()[0];
    QObject *item = win->findChild<QObject*>("myButton");
    QObject::connect(item, SIGNAL(doAnalyzeSignal(QString,QString,QString,QString)), &analyzeSignal, SLOT(cppSlot(QString,QString,QString,QString)));

    return app.exec();
}

这很有效!