我想用Qt tcp socket和QML编写一个程序。 我将把由QML创建的文本框变量更改为由tcp套接字通过远程客户端获取的新数据? 我的代码段是:
void Server::startRead()
{
client->waitForReadyRead(3000);
QString buf= client->readAll();
qDebug() << buf;
QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:///main.qml")));
QObject *rootObject = engine.rootObjects().first();
QObject *qmlObject = rootObject->findChild<QObject*>("ttt");
qDebug() << "before change"
qDebug() << qmlObject->property("text");
qmlObject->setProperty("text", "new data");
qDebug() << "after change"
qDebug() << qmlObject->property("text");
}
main.qml
import QtQuick 2.0
import QtQuick 2.2
import QtQuick.Window 2.1
import QtQuick.Window 2.2
import QtQuick.Controls 1.2
Window{
width:400
height:400
visible:true
Item {
id: rootItem
property string text
Text {
id: message
text: rootItem.text
}
}
}
我真的很感激。
答案 0 :(得分:1)
有很多方法可以做到这一点。下面的示例演示如何从cpp更改qml元素属性。如果您需要更改可见性,请使用bool属性而不是我在示例中使用的字符串。
<强> 1。我认为这是一个很好的解决方案。
您可以创建qml适配器
class ServerQMLAdapter : public QQuickItem
{
Q_OBJECT
Q_PROPERTY(QString data READ data WRITE setData NOTIFY dataChanged)
public:
explicit ServerQMLAdapter(QQuickItem *parent = nullptr) : QQuickItem(parent){}
QString data() const {
return mData;
}
void setData(const QString &data) {
if(mData == data)
return;
mData = data;
emit dataChanged();
}
private slots:
/**
this slots called on data read
*/
void onDataRead(const QString &data) {
setData(data);
}
private:
QString mData = QString();
};
在应用程序类中,您可以注册您的适配器
qmlRegisterType<ServerQMLAdapter>("ServerQMLAdapter", 1, 0, "ServerQMLAdapter");
之后,您可以在qml文件中使用它
import ServerQMLAdapter 1.0
Item {
ServerQMLAdapter {
id: myAdapter
}
Text {
id: message
text: myAdapter.data
}
}
<强> 2。您可以从cpp。
更改属性就像你在你的片段中那样做
auto rootObject = engine.rootObjects().first();
rootObject->setProperty("text", "new data");
并将此propetry添加到您的qml文件
Item {
id: rootItem
property string text
Text {
id: message
text: rootItem.text
}
}
第3。使用调用的方法
来自你的cpp文件
auto rootObject = engine.rootObjects().first();
QMetaObject::invokeMethod(rootObject, "setText",
Q_ARG(QVariant, QVariant::fromValue(data)));
并将功能添加到qml文件
Item {
id: rootItem
function setText(data) {
message.text = data;
}
Text {
id: message
}
}