如何在QT中通过tcp socket远程更改文本框数据?

时间:2017-11-14 20:41:18

标签: qt sockets qml

我想用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
      }
    }

}

我真的很感激。

1 个答案:

答案 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
  }
}