2015-09-05 24 views
1

我認爲我的問題非常簡單。儘管如此,我還是無法弄清楚。我在我的.qml文件中定義了一個TextArea,該文件需要從C++代碼動態更新。從C++更新QML中的TextArea

不幸的是,我不知道如何從imserver.cpp類訪問/更新TextArea

任何人都可以幫助我嗎?

這裏是.qml文件:

import QtQuick 2.2 
    import QtQuick.Controls 1.1 


    ApplicationWindow { 
     visible: true 
     width: 640 
     height: 480 

     title: qsTr("IMServer") 

     menuBar: MenuBar { 
     Menu { 
      title: qsTr("File") 
      MenuItem { 
      text: qsTr("Exit") 
      onTriggered: Qt.quit(); 
      } 
     } 
     } 

     TextArea { 
     id: serverInformation 
     x: 0 
     y: 0 
     width: 247 
     height: 279 
     } 
    } 

我的main.cpp:

#include <QApplication> 
    #include <QQmlApplicationEngine> 
    #include <QQmlContext> 
    #include <QQmlEngine> 
    #include <QtQml> 

    #include "imserver.h" 

    int main(int argc, char *argv[]) { 
     QApplication app(argc, argv); 

     QQmlApplicationEngine engine; 
     engine.load(QUrl(QStringLiteral("qrc:///main.qml"))); 

     IMServer server(2000); 

     qmlRegisterUncreatableType<IMServer>("App", 1, 0, "IMServer", ""); 
     engine.rootContext()->setContextProperty("imserver", &server); 

     server.startServer(); 

     return app.exec(); 
    } 

imserver.h

#ifndef IMSERVER_H 
#define IMSERVER_H 

#include <QTcpServer> 
#include <QTcpSocket> 
#include <QAbstractSocket> 
#include <QThreadPool> 

class IMServer : public QTcpServer { 

    Q_OBJECT 
    Q_PROPERTY(QString text WRITE setText NOTIFY textChanged) 

public: 
    explicit IMServer(int port, QObject *parent = 0); 
    void startServer(); 
    void setText(const QString &txt); 

signals: 
    void textChanged(); 

public slots: 

protected: 
    void incomingConnection(qintptr fd); 

private: 
    int port; 
    QThreadPool *pool; 
    QString m_text; 
}; 


#endif // IMSERVER_H 

imserver.cpp:

#include "imserver.h" 
#include "clienthandler.h" 

IMServer::IMServer(int port, QObject *parent) : QTcpServer(parent) { 
    this->pool = new QThreadPool(this); 
    this->pool->setMaxThreadCount(100); 
    this->port = port; 
} 

void IMServer::startServer() { 

    setText("TEST"); 

    if (!this->listen(QHostAddress::Any, this->port)) { 
    qDebug() << "Server could not be started"; 
    } else { 
    qDebug() << "Server started, listening..."; 
    } 
} 

void IMServer::setText(const QString &txt) { 
    m_text = txt; 
    emit textChanged(); 
} 


void IMServer::incomingConnection(qintptr fd) { 
    ClientHandler *client = new ClientHandler(); 
    client->setAutoDelete(true); 
    client->fd = fd; 
    this->pool->start(client); 
} 

回答

2

有幾種方法。這是我該怎麼做的。

首先要註冊你的IMServer類:

qmlRegisterUncreatableType<IMServer>("App", 1, 0, "IMServer", ""); 

然後您在IMServer實例添加到QML:

enigne.rootContext()->setContextProperty("imserver", &server); 

你IMServer類則需要一個信號,那你的文本區可以連接到,或者甚至更好地添加一個屬性(您需要在此處添加getText()函數和textChanged()信號,以獲得只讀屬性):

更新時間:

Q_PROPERTY(QString text READ getText NOTIFY textChanged) 

在文本區域,那麼你可以創建一個綁定:

TextArea { 
    text: imserver.text 
} 

然後每當你放出框TextChanged在IMServer類,TextArea中的文本將被更新。 更多信息:http://doc.qt.io/qt-5/qtqml-cppintegration-topic.html

+0

我把'qmlRegisterUncreatableType ( 「應用程序」,1,0, 「IMServer」, 「」);'與所述的main.cpp文件包括'的#include '和' QT + = qml'也在.pro文件中,但我仍然得到'qmlRegisterUncreatableType未在此範圍內聲明'的錯誤? – wasp256

+0

#include 使用此功能。 – Gusch5

+0

好的thx,你可以解釋什麼信號設置上述屬性在頭文件後設置?我怎樣才能設置textarea的值? – wasp256