如何在C++上的Qt Quick TextEdit对象上运行命令?

Mik*_*rts 4 qt qml qt-quick qt5 qt5.5

我通过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: ""
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用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
Run Code Online (Sandbox Code Playgroud)

记录的输出是:

terminalText:  QQuickTextEdit(0x7fce34c2b6a0, name = "terminalText")
Run Code Online (Sandbox Code Playgroud)

这意味着它能够在UI中找到对象.但是,似乎尽管将QObject指针强制转换为QTextEdit指针,但它认为自己是QQuickTextEdit.

我不能确定正是这意味着什么,但我很困惑,为什么append()方法,如图所示这里,会导致应用程序崩溃.

做了一些调查后,看起来似乎是积极的,但它似乎提供了对QQuickTextDocument的只读访问,这也消除了使用QTextEdit方法的可能性.此外,我无法实际访问此对象:

QObject *terminalTextDocument = terminalText->document();
qDebug() << "terminalTextDocument: " << terminalTextDocument;
Run Code Online (Sandbox Code Playgroud)

只是崩溃了.

我该怎么做才能访问Qt Quick的TextEdit附加方法?

Rei*_*ica 5

正如你看到自己的类型,terminalTextQQuickTextEdit*,不是 QTextEdit*.你不能在两者之间施放.就这样.

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

或者,您使用私有Qt标头并使用正确的C++类型:

#include <private/qquicktextedit_p.h>

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