F:\00-Work\2023_05_26_qml_learn\learn2\main.cpp:29: error: 'engine' was not declared in this scope F:/00-Work/2023_05_26_qml_learn/learn2/main.cpp:29:39: error: 'engine' was not declared in this scope 29 | QMetaObject::invokeMethod(engine.rootObjects().first(), "updateVideoOutput", Q_ARG(QVariant, QVariant::fromValue(qimg))); | ^~~~~~
时间: 2024-03-14 07:47:08 浏览: 347
抱歉,我在之前的回答中漏掉了一些代码。需要在main.cpp文件中添加如下代码来初始化QQmlApplicationEngine对象:
```
QQmlApplicationEngine engine;
const QUrl url(QStringLiteral("qrc:/main.qml"));
QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
&app, [url](QObject *obj, const QUrl &objUrl) {
if (!obj && url == objUrl)
QCoreApplication::exit(-1);
}, Qt::QueuedConnection);
engine.load(url);
```
这段代码会加载QML文件,并创建QQmlApplicationEngine对象。之后,你可以使用engine对象来获取QML界面的根对象,即调用engine.rootObjects().first()。这样,在摄像头采集到新的帧时,就可以使用QMetaObject::invokeMethod方法来调用QML界面中的updateVideoOutput函数了。
请注意,你需要将engine对象声明为全局变量或静态变量,以便在其他函数中使用。
相关问题
F:\00-Work\2023_05_26_qml_learn\learn3\ShowMatItem.cpp:14: error: no declaration matches 'void ShowMatItem::camera_open()' F:/00-Work/2023_05_26_qml_learn/learn3/ShowMatItem.cpp:14:6: error: no declaration matches 'void ShowMatItem::camera_open()' 14 | void ShowMatItem::camera_open(){ | ^~~~~~~~~~~ F:/00-Work/2023_05_26_qml_learn/learn3/ShowMatItem.cpp:14:6: note: no functions named 'void ShowMatItem::camera_open()'
这个错误提示是由于编译器找不到名为 `camera_open` 的函数的声明,可能是因为你在 `ShowMatItem.cpp` 文件中定义了这个函数,但是在 `ShowMatItem.h` 文件中没有声明。你需要在 `ShowMatItem.h` 文件中添加如下声明:
```cpp
public:
void camera_open();
```
这样编译器就能找到该函数的声明,从而解决该错误。
F:\00-Work\2023_05_26_qml_learn\learn2\VideoCaptureItem.cpp:28: error: Member access into incomplete type 'QPainter'
这个错误通常是因为没有包含 `QPainter` 头文件或者没有正确的命名空间引入。
请确认你的代码中包含了正确的头文件和命名空间。通常情况下,你需要包含 `QPainter` 头文件,并使用 `QtGui` 命名空间。例如:
```cpp
#include <QPainter>
#include <QtGui>
// ...
QPainter painter(this);
```
如果你已经包含了正确的头文件和命名空间,但仍然遇到了这个错误,可能是因为在 `VideoCaptureItem.cpp` 文件中没有找到 `QPainter` 类型的定义。请确保你的 `VideoCaptureItem.cpp` 文件中包含了 `QPainter` 头文件并且链接了正确的 Qt 库。
阅读全文