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附加方法?
正如你看到自己的类型,terminalText是QQuickTextEdit*,不是 QTextEdit*.你不能在两者之间施放.就这样.
要从C++调用其方法,您需要使用QMetaObject::invokeMethod或QMetaMethod::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)