【发布时间】:2016-06-06 18:29:50
【问题描述】:
我正在通过 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 的 append 方法?
【问题讨论】:
-
总的来说,从 C++ 更改 qml 对象并不是最好的设计。您可以在官方文档中找到警告 - doc.qt.io/qt-5/qtqml-cppintegration-interactqmlfromcpp.html。我建议您在 C++ 中使用 Q_PROPERTY 来保存您要显示的文本,将 TextEdit.text 绑定到该属性并在需要时更改它。