如何从 C++ 对 Qt Quick TextEdit 对象执行 运行 命令?

How can I run commands on a Qt Quick TextEdit object from C++?

我这样通过 QML 在 Qt Quick 中使用 TextEdit 对象:

TextEdit {
    id: terminalText
    objectName: "terminalText"

    anchors.centerIn: parent
    font.family: "Courier New"
    Accessible.name: "document"
    baseUrl: "qrc:/"
    textFormat: Qt.PlainText

    width: parent.width - 30
    wrapMode: TextEdit.Wrap

    text: ""
}

我正在尝试使用 C++ 直接与该对象交互。

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

QObject *rootObject = engine.rootObjects().first();
terminal = rootObject->findChild<QObject*>("terminal");
QTextEdit *terminalText = (QTextEdit*)terminal->findChild<QObject*>("terminalText");
qDebug() << "terminalText: " << terminalText;
terminalText->append("test"); // Code crashes here

记录的输出是:

terminalText:  QQuickTextEdit(0x7fce34c2b6a0, name = "terminalText")

表示可以在UI中找到对象。然而,似乎尽管将 QObject 指针转换为 QTextEdit 指针,它仍将自己视为 QQuickTextEdit。

我不确定这到底是什么意思,但我很困惑为什么 append() 方法(如 here 所示)会导致应用程序崩溃。

经过一些调查,this 最初似乎是肯定的,但它似乎提供了对 QQuickTextDocument 的只读访问,这也消除了使用 QTextEdit 方法的可能性。此外,我无法实际访问此对象:

QObject *terminalTextDocument = terminalText->document();
qDebug() << "terminalTextDocument: " << terminalTextDocument;

也会崩溃。

如何访问 Qt Quick 的 TextEdit 的追加方法?

如您所见,terminalText 的类型是 QQuickTextEdit* 不是 QTextEdit*。你不能在两者之间投射。就这些了。

要从 C++ 调用它的方法,您需要使用 QMetaObject::invokeMethodQMetaMethod::invoke

或者,您可以使用私有 Qt 头文件并使用正确的 C++ 类型:

#include <private/qquicktextedit_p.h>

...
auto terminalText = terminal->findChild<QQuickTextEdit*>("terminalText");
if (!terminalText) return;
terminalText->append("foo");