Хобрук: Ваш путь к мастерству в программировании

Обновить TextArea в QML с C++

Мой вопрос довольно прост, я думаю. Тем не менее я не смог разобраться. У меня есть TextArea, определенный в моем файле .qml, который необходимо динамически обновлять из кода C++.

К сожалению, я не знаю, как получить доступ/обновить TextArea из класса imserver.cpp.

Может ли кто-нибудь помочь мне, пожалуйста?

Вот файл .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);
} 
05.09.2015

Ответы:


1

Есть несколько способов. Вот как бы я это сделал.

Сначала вы должны зарегистрировать свой класс IMServer:

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

Затем вы добавляете свой экземпляр IMServer в QML:

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

Затем вашему классу IMServer нужен сигнал, к которому можно подключить ваш TextArea, или, что еще лучше, добавить свойство (вам также нужно добавить сюда функцию getText() и сигнал textChanged() для свойства только для чтения):

Обновлено:

Q_PROPERTY(QString text READ getText NOTIFY textChanged)

Затем в TextArea вы можете создать привязку:

TextArea {
  text: imserver.text
}

Затем всякий раз, когда вы испускаете textChanged в своем классе IMServer, текст TextArea будет обновляться. Для получения дополнительной информации: http://doc.qt.io/qt-5/qtqml-cppintegration-topic.html

05.09.2015
  • Я поместил qmlRegisterUncreatableType<IMServer>("App", 1, 0, "IMServer", ""); в файл main.cpp с включением #include <QQmlEngine>, а QT += qml также находится в файле .pro, но я все еще получаю сообщение об ошибке «qmlRegisterUncreatableType не был объявлен в этой области»? 05.09.2015
  • #include ‹QtQml›, чтобы использовать эту функцию. 05.09.2015
  • Хорошо, спасибо, не могли бы вы объяснить, какие сигналы нужно установить после размещения вышеуказанного свойства в заголовочном файле? Как я могу установить значение textarea? 05.09.2015
  • Вам нужен сигнал void textChanged(); И он будет использоваться как void setText(const QString& txt) { m_text = txt; испускать текстИзмененный(); } 05.09.2015
  • Я обновил код сейчас, но MEMBER в Q_Property выдал мне ошибку, поэтому вместо этого я попытался использовать WRITE. Значение, которое я пытаюсь установить в текстовую область, не записывается... 05.09.2015
  • Новые материалы

    HMTL - Многозадачное обучение для решения задач НЛП
    Достижение результатов SOTA путем передачи знаний между задачами Область обработки естественного языка включает в себя десятки задач, среди которых машинный перевод, распознавание именованных..

    Решения DBA Metrix
    DBA Metrix Solutions предоставляет удаленного администратора базы данных (DBA), который несет ответственность за внедрение, обслуживание, настройку, восстановление базы данных, а также другие..

    Начало работы с Блум
    Обзор и Codelab для генерации текста с помощью Bloom Оглавление Что такое Блум? Некоторые предостережения Настройка среды Скачивание предварительно обученного токенизатора и модели..

    Создание кнопочного меню с использованием HTML, CSS и JavaScript
    Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

    Внедрите OAuth в свои веб-приложения для повышения безопасности
    OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

    Классы в JavaScript
    class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

    Как свинг-трейдеры могут использовать ИИ для больших выигрышей
    По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..