为什么我的QML Textarea不附加
Why is my QML textArea not appending?
我正在尝试编写一些与QML对象交互的QT C 代码。目的是让在GUI上附加到文本日志的TCP插座上接收字符串。每次收到新字符串时,我都会运行appendText((函数。我有一个使用Qwidgets和.UI文件的目前工作的实现。我需要具有相同的QML实现。我的Qwidget实现使用textrowser和附加功能,例如以下内容。随着程序的运行," thestring"正在发生变化,并附加了每个更改,填充文本日志。
//update the text log with data received on TCP socket
void MainWindow::appendText() {
ui->textBrowser->append(theString);
}
这给了我所需的结果,将每个字符串附加到文本框时。输出应该看起来像以下内容。
Control connection successful.
Data connection successful.
Control Packet Receieved:
1
Control Packet Receieved:
2
Control Packet Receieved:
3
Control Packet Receieved:
4
Control Packet Receieved:
1
Control Packet Receieved:
2
Control Packet Receieved:
3
Control Packet Receieved:
4
但是,当我认为使用以下代码的QML对象做我认为是相同的函数...
//update the text log with data received on TCP socket
void MainWindow::appendText() {
QMetaObject::invokeMethod(textbox, "append", Qt::DirectConnection, Q_ARG(QVariant, theString));
//QQmlProperty(textbox, "text").write(theString);
}
它仅附加了前两个字符串,而不再添加。输出看起来像这样。
Control connection successful.
Data connection successful.
我已经查看了该文档,以广泛调用C 中的QML方法,但仍然没有任何运气。任何帮助都将受到赞赏。感谢您的时间。
我无法再现您的问题。
可能的解决方案
它可能是使用import QtQuick.Controls 2.0
的解决方案。
在这种情况下,我获得以下错误消息:
QMetaObject::invokeMethod: No such method QQuickTextArea::append(QVariant) Candidates are: append(QString)
正如错误消息所建议的那样,您现在应该使用QString
而不是QVariant
作为参数类型:
QMetaObject::invokeMethod(textbox, "append", Qt::DirectConnection, Q_ARG(QString, theString));
更好的替代品
正如QT所述,您应该避免从C (深入对象树(操纵QML对象:
警告:虽然可以使用C 访问和操纵QML对象深入对象树,但我们建议您不要 在应用程序测试和原型制作之外采用这种方法。一 QML和C 集成的强度是实施 QML用户界面与C 逻辑和数据集后端分开 如果C 一侧深入QML,此策略会破坏 直接操纵它们的组件。
因此,在C 中实现信号可能是更好的替代方法,该信号发出新接收的消息并从QML侧连接到它。这种方法显然将用户界面和编程逻辑分开。
工作示例代码
以下代码每秒将"test"
附加到TextArea
。
main.cpp:
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QTimer>
#include <QQuickItem>
QObject *textbox;
void onTimeout()
{
QMetaObject::invokeMethod(textbox, "append", Qt::DirectConnection, Q_ARG(QVariant, "test"));
}
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
QTimer t;
QObject::connect(&t, &QTimer::timeout, &onTimeout);
textbox = engine.rootObjects().first()->children().first();
t.start(1000);
return app.exec();
}
main.qml:
import QtQuick 2.0
import QtQuick.Window 2.2
import QtQuick.Controls 1.0
Window
{
visible: true
width: 600
height: 600
TextArea
{
id: textbox
anchors.fill: parent
}
}
- 我的神经网络不起作用 [XOR 问题]
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 我的字符计数代码计算错误.为什么
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- cmake在我的项目中所需的所有静态库都不成功
- 为什么我的代码在输出中增加了93天
- 我的简单if-else语句是如何无法访问的代码
- 为什么我的for循环不能正确获取argv
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- 0-1背包代码中的错误.我的代码中有什么错误
- 当我的阵列太大时出现分段错误
- 如何确认我的constexpr表达式实际上已经在编译时执行
- 为什么二进制搜索在我的测试中不起作用
- 如何指定我希望我的LIB链接到的DLL文件?-Visual Studio 2019
- 我的代码中有错误吗?使用BGI图形的C++代码对我不起作用
- 当我在main中声明了我的2d数组时,为什么我的程序会退出
- OpenGL在启用深度测试时不会丢弃我的碎片
- 为什么我的 std::ref 无法按预期工作?
- clang整洁10忽略了我的NOLINT命令
- 为什么我的QML Textarea不附加