Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Qt] получить значение свойства в классе, qt 5.3 
V
    Опции темы
uwannadie
Дата 17.7.2014, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 5.6.2009
Где: Крым, Керчь

Репутация: нет
Всего: 1



собственно вопрос:
имеется класс, надо получить значение свойства.
использую плюсы совсем недавно, поэтому скорее всего что-то сделал не так.
кусок кода:

h файл
Код

#ifndef SOCKETCLIENT_H
#define SOCKETCLIENT_H

#include <QWidget>
#include <QTcpSocket>

class SocketClient : public QWidget
{
    Q_OBJECT
private:
    QTcpSocket *socket;
    QString message;
    QString result;

public:
    Q_PROPERTY(QString Result READ Result WRITE setResult NOTIFY ResultChanged)
    SocketClient(const QString & strHost, int nPort, const QString & Message, QWidget *parent = 0);
    QString Result() const;


signals:    
    void ResultChanged(const QString &value);

private slots:
    void onConnected();
    void onReadyRead();
    void onDisplayError(QAbstractSocket::SocketError socketError);

public slots:
    void setResult(const QString &value);
};

#endif // SOCKETCLIENT_H

код
Код

#include "socketclient.h"
#include <QTcpSocket>

SocketClient::SocketClient(const QString & strHost, int nPort, const QString & Message, QWidget *parent) :
    QWidget(parent)
{
    socket = new QTcpSocket(this);
    socket->connectToHost(strHost, nPort);
    connect(socket, SIGNAL(connected()), this, SLOT(onConnected()));
    connect(socket, SIGNAL(readyRead()), this, SLOT(onReadyRead()));
    connect(socket, SIGNAL(error(QAbstractSocket::SocketError)),this, SLOT(onDisplayError(QAbstractSocket::SocketError)));
    message = Message;
}

void SocketClient::onConnected()
{
    QByteArray outBuf;
    outBuf.append(message);
    socket->write(outBuf);
    qDebug() << "SEND: " << outBuf;
}

void SocketClient::onReadyRead()
{
    QByteArray byteblock;
    while (!socket->atEnd())
    {
        QByteArray data = socket->read(100);
        byteblock += data;
    }
    qDebug() << "READ: " << byteblock;

    result = byteblock.constData();
    socket->close();
}

void SocketClient::onDisplayError(QAbstractSocket::SocketError socketError)
{
    QString strError =
            "Error: " + (socketError == QAbstractSocket::HostNotFoundError ?
                         "The host was not found." :
                         socketError == QAbstractSocket::RemoteHostClosedError ?
                         "The remote host is closed." :
                         socketError == QAbstractSocket::ConnectionRefusedError ?
                         "The connection was refused." :
                         QString(socket->errorString())
                        );
    result = strError;
}

void SocketClient::setResult(const QString &value)
{
    if (result == value) return;
    result = value;
    emit ResultChanged(value);
}

QString SocketClient::Result() const
{
    return result;
}


потом в основной проге использую так:
Код

SocketClient client(ip_addr, port_num, data);
int progress = client.Result().toInt();

но данные не возвращаются.
пробовал и так:
Код

SocketClient* client = new SocketClient(ip_addr, port_num, data);
int progress = client->Result().toInt();


при этом в дебаг все нормально выводится

Это сообщение отредактировал(а) uwannadie - 17.7.2014, 14:33
--------------------
PM MAIL   Вверх
Guinness
Дата 18.7.2014, 07:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 21.6.2009
Где: Зеленоград

Репутация: 2
Всего: 10



Тему надо бы в раздел Qt.
Для начала код вида:
Код

SocketClient client(ip_addr, port_num, data); 
SocketClient* client = new SocketClient(ip_addr, port_num, data);

это по сути своей одно и тоже. Только в первом случае память выделяется на стеке,  и по выходу из области видимости автоматически освобождается. Во втором случае память выделяется в куче и Вы работаете с указателем. Здесь автоматически ничего не удалится, и за выделенную память отвечаете Вы сами. В C++ есть обертки для указателей, облегчающие работу с ними - это std::shared_ptr, std::unique_ptr, для Qt есть QSharedPointer, QScopedPointer и т.д.
Также в Qt есть одна особенность. Если для объекта, унаследованного от QObject, указать родителя(parent), то в случае удаления родителя удалится и этот объект.
Теперь по поводу почему ничего не записывается в result. Проблема в том, что по вызову:
Код

socket = new QTcpSocket(this);
socket->connectToHost(strHost, nPort);

Происходит асинхронное подключение к серверу. Поэтому, когда Вы обращаетесь к result, там ещё ничего не записано.
Вам нужно заменить вот эту строчку:
Код

result = byteblock.constData();

на 
Код

setResult(byteblock.constData());

Тогда в случае, если будет изменяться результат, Ваш класс будет сообщать об этогм своим подписчикам посредством сигнала ResultChanged. Соответственно, Вам нужно написать класс обработчик этого сигнала, который бы каким либо образом реагировал на данный сигнал.
Код

class ProcessResult : public QObject
{
Q_OBJECT
public:
    ...
public slots:
    void onResultChanged(const QString &result);
};

Ну и подключить его к сигналу от SocketClient с помощью connect. И имхо SocketClient не нужно наследовать от QWidget, лучше от QObject. А если нужно выводить результат в GUI, то лучше ProcessResult сделать наследником QWidget.
PM MAIL   Вверх
uwannadie
Дата 18.7.2014, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 5.6.2009
Где: Крым, Керчь

Репутация: нет
Всего: 1



спасибо за подсказку, исправил чутка  smile 
--------------------
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0908 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.