为什么我的QML Textarea不附加

Why is my QML textArea not appending?

本文关键字:Textarea 我的 QML 为什么      更新时间:2023-10-16

我正在尝试编写一些与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
    }
}