如何从其他QML文件及C++页面修改Label的文本内容?
Alright, let's tackle your two requirements step by step: modifying the labelname text from main.qml, and updating it via a C++ signal. Here's how you can do both:
1. Update labelname Text from main.qml
First, you need to expose the labelname's text property so it's accessible from outside text.qml. We'll add a top-level property to the Item in text.qml and bind the label's text to it:
Modified text.qml:
import QtQuick 2.0 import QtQuick.Controls 2.3 Item { // Expose a property for external access property string userName: qsTr("John") Rectangle { id: rectangle x: 0 y: 0 width: 672 height: 480 color: "#ffffff" GroupBox { id: groupBox x: 56 y: 155 width: 537 height: 285 title: qsTr("Group box") Label { id: labelname x: 54 y: 27 // Bind the label's text to our exposed property text: userName } Label { id: labelsname2 x: 54 y: 62 text: qsTr("devid") } } } }
Now, in main.qml, instantiate the text.qml component, give it an ID, and modify the userName property directly in the button's onClicked handler:
Modified main.qml:
import QtQuick 2.12 import QtQuick.Window 2.12 import QtQuick.Controls 2.3 Window { visible: true width: 672 // Match the rectangle width in text.qml for full visibility height: 480 title: qsTr("Hello World") // Instantiate the text.qml component with an ID Item { id: textComponentInstance anchors.fill: parent source: "text.qml" } Button { id: button x: 190 y: 127 text: qsTr("change name") onClicked: { // Update the exposed property to change labelname's text textComponentInstance.userName = "Alice" } } }
2. Update labelname Text via C++ Signal
Next, let's set up a C++ class that emits a signal carrying the username, then connect that signal to our QML property.
Step 1: Create the C++ Signal Class
Create a NameSender class that inherits from QObject and defines a signal for sending names:
#include <QObject> class NameSender : public QObject { Q_OBJECT public: explicit NameSender(QObject *parent = nullptr) : QObject(parent) {} signals: // Signal to send the new username to QML void sendName(const QString &newName); public slots: // A test slot to trigger the signal (you can call this from your C++ logic) void triggerNameUpdate() { emit sendName("Bob from C++"); } };
Step 2: Register the Class with QML
In your main.cpp, register the NameSender class so it's accessible in QML, and create an instance to expose as a context property:
#include <QGuiApplication> #include <QQmlApplicationEngine> #include "namesender.h" // Include your header file int main(int argc, char *argv[]) { #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); #endif QGuiApplication app(argc, argv); // Register the NameSender class with QML qmlRegisterType<NameSender>("com.example", 1, 0, "NameSender"); QQmlApplicationEngine engine; const QUrl url(QStringLiteral("qrc:/main.qml")); QObject::connect(&engine, &QQmlApplicationEngine::objectCreated, &app, [url](QObject *obj, const QUrl &objUrl) { if (!obj && url == objUrl) QCoreApplication::exit(-1); }, Qt::QueuedConnection); // Create a NameSender instance and expose it to QML NameSender *nameSender = new NameSender(); engine.rootContext()->setContextProperty("nameSender", nameSender); engine.load(url); return app.exec(); } #include "main.moc" // Required for Qt's meta-object system
Step 3: Connect the C++ Signal in QML
Update main.qml to connect the C++ signal to the textComponentInstance's userName property. We'll also add a button to trigger the C++ slot for testing:
import QtQuick 2.12 import QtQuick.Window 2.12 import QtQuick.Controls 2.3 import com.example 1.0 // Import our registered C++ class Window { visible: true width: 672 height: 480 title: qsTr("Hello World") Item { id: textComponentInstance anchors.fill: parent source: "text.qml" } Button { id: qmlButton x: 190 y: 127 text: qsTr("change name from QML") onClicked: { textComponentInstance.userName = "Alice" } } Button { id: cppButton x: 190 y: 180 text: qsTr("change name from C++") onClicked: { // Trigger the C++ slot to emit the signal nameSender.triggerNameUpdate() } } // Connect the C++ signal to update our QML property Connections { target: nameSender function onSendName(newName) { textComponentInstance.userName = newName } } }
That's it! Now you can update the labelname text either from QML directly or via a signal emitted from C++.
内容的提问来源于stack exchange,提问作者sagar bade

