【问题标题】:How can I run commands on a Qt Quick TextEdit object from C++?如何从 C++ 对 Qt Quick TextEdit 对象运行命令?
【发布时间】: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 绑定到该属性并在需要时更改它。

标签: qt qml qt5 qt-quick qt5.5


【解决方案1】:

如您所见,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");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多