gpt4 book ai didi

C++ 信号和访问 QtQuick 项

转载 作者:行者123 更新时间:2023-11-28 02:27:30 25 4
gpt4 key购买 nike

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

QtQuick 按钮发出由 C++ 层监听的信号。到目前为止一切正常。

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

我尝试了很多东西,但我没有找到正确的方法来做到这一点

最佳答案

我遇到了类似的问题。我就是这样解决的。

在 C++ 中,我创建了一个使用 QProcess 处理命令的类(并将该类公开给 QML),它将 readyToRead 信号附加到我公开的类中的 C++ 函数,该函数发出另一个信号 showOutput 与输出文本。

根据这些信息,我只需将我的新信号连接到 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 中设置为上下文属性:像这样:

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 作为属性(顺便说一句,它有一些语法错误),它是一种信号方法,对吗?因此,它会自 Action 为信号而不是属性提供给 QML。

不要创建新的 QQMLContext。在这一行中,您正在做的是创建一个新的 QQMLContext

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

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

关于C++ 信号和访问 QtQuick 项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30030215/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com