如何从 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::invokeMethod
或 QMetaMethod::invoke
。
或者,您可以使用私有 Qt 头文件并使用正确的 C++ 类型:
#include <private/qquicktextedit_p.h>
...
auto terminalText = terminal->findChild<QQuickTextEdit*>("terminalText");
if (!terminalText) return;
terminalText->append("foo");
我这样通过 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::invokeMethod
或 QMetaMethod::invoke
。
或者,您可以使用私有 Qt 头文件并使用正确的 C++ 类型:
#include <private/qquicktextedit_p.h>
...
auto terminalText = terminal->findChild<QQuickTextEdit*>("terminalText");
if (!terminalText) return;
terminalText->append("foo");