Russian Qt Forum
Ноябрь 23, 2024, 22:38 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Модель-представление, работа через сеть  (Прочитано 10591 раз)
AlphaGh0St
Гость
« : Июнь 27, 2011, 21:10 »

Всем привет!
В образовательных и практических целях пишу (точнее пытаюсь) программку, работающую по технологии Модель-представление через сеть.

Но столкнулся с рядом проблем. С начала даже не знал, от чего отталкиваться. Потом подсказали...

Написал простенький сервер, который в хранит список строк. Строки в список можно добавлять и удалять. Если клиент отсылает серверу строку "3. ", то сервер возвращает весь список.

Задумка следующая: клиентская программа должна работать по технологии Модель-представление и отображать текущее состояние списка на сервере.

Как это реализовать?
Нужно переопределить метод data() в своём классе так, чтобы он запрашивал данные у сервера... но, сколько с ним просидел, ничего не получилось.

Благодарю за внимание.
« Последнее редактирование: Июнь 28, 2011, 22:34 от AlphaGh0St » Записан
AlphaGh0St
Гость
« Ответ #1 : Июнь 28, 2011, 20:21 »

Судя по количеству просмотров, тема интересна не для меня одного.
Если у кого-нибудь есть опыт в написании таких программ, пожалуйста, поделитесь.
Записан
ieroglif
Гость
« Ответ #2 : Июнь 28, 2011, 23:17 »

Судя по количеству просмотров, тема интересна не для меня одного.
Если у кого-нибудь есть опыт в написании таких программ, пожалуйста, поделитесь.
да ничего особо интеренсного/сложного нет.
есть класс модели, если класс подгружения данных по сети в модель (сетевик).
на какие события сетевик подгружает данные - дело индивидуальное.
как только появляются обновления в данных - он сообщает об этом модели.
всё.
Записан
AlphaGh0St
Гость
« Ответ #3 : Июнь 30, 2011, 16:52 »

В теории, действительно, особо сложного ничего нет, но давайте перейдём к практике.
Почитав документацию и провозившись целый день, некоторые моменты стали понятны, но я снова зашёл в тупик.

Понял, что сервер написан не правильно, переписал так, как посоветовали: если серверу отправить строку "length", он вернёт общее количество хранимых у себя строк. Если отправить номер строки, сервер вернёт строку по этому номеру.
Сервер работает правильно, 100%.

Переписал модель: метод rowCount() отсылает серверу строку "length" и возвращает общее количество строк. Метод data() по идее должен отсылать серверу число, а по этому числу, сервер вернёт указанную строку.
Но, если метод rowCount() вызывается и не однократно, то data() не вызывается вовсе.

Сейчас приведу код. Прошу сильно не сердиться за кривой код. На данный момент, мне... "лишь бы заработало".
Вот код метода rowCount()
Код:
int NetworkModelRO::rowCount(const QModelIndex &parent) const {
    slotSendToServer("length"); // посылаем серверу запрос на общее кол-во строк

// ответ считывается в переменную stringNetworkMessage
// (она определена в классе) из слота получения ответа от сервера
    int n = stringNetworkMessage.toInt(); 

    qDebug() << "stringNetworkMessage.toInt() => " << n;

    return n;
}
Этот метод работает.


Метод data(), вот с ним проблема
Код:
QVariant NetworkModelRO::data(const QModelIndex &index, int role) const {
    qDebug() << "data(): index.row() => " << index.row();

    if (!index.isValid())
        return QVariant();

    if (index.row() >= rowCount())
        return QVariant();

    if (role == Qt::DisplayRole){
        QString tmp = QString("%1").arg(index.row()); // переводим указанный индекс в строку
        slotSendToServer(tmp); // отправляем его серверу

        qDebug() << "data(): stringNetworkMessage => " << stringNetworkMessage;

        return stringNetworkMessage; // получаем ответ в этой переменной (строка по указанному индексу)
        }
    else
        return QVariant();
}

В чём проблема? Где я допустил ошибку?
« Последнее редактирование: Июнь 30, 2011, 16:54 от AlphaGh0St » Записан
BRE
Гость
« Ответ #4 : Июнь 30, 2011, 16:56 »

А что возвращает columnCount?
Ноль?
Записан
AlphaGh0St
Гость
« Ответ #5 : Июнь 30, 2011, 17:21 »

columnCount() ?
Я его не переопределял. Согласно документации, по скольку у меня список, переопределять метод columnCount() нет необходимости, нужен лишь метод rowCount().
А...не ужели метод columnCount тоже нужен?
Записан
BRE
Гость
« Ответ #6 : Июнь 30, 2011, 17:28 »

Просто пытаюсь понять, почему не вызывается data().  Улыбающийся
А rowCount возвращает точно не 0?
Записан
AlphaGh0St
Гость
« Ответ #7 : Июнь 30, 2011, 17:48 »

вот отладочные данные от rowCount()
строк на сервере 3.
Код:
stringNetworkMessage.toInt() =>  0 
stringNetworkMessage.toInt() =>  0
stringNetworkMessage.toInt() =>  0
stringNetworkMessage.toInt() =>  0
stringNetworkMessage.toInt() =>  3
stringNetworkMessage.toInt() =>  3
stringNetworkMessage.toInt() =>  3
stringNetworkMessage.toInt() =>  3
stringNetworkMessage.toInt() =>  3
stringNetworkMessage.toInt() =>  3
stringNetworkMessage.toInt() =>  3
stringNetworkMessage.toInt() =>  3
stringNetworkMessage.toInt() =>  3
Записан
Kolobok
Гость
« Ответ #8 : Июнь 30, 2011, 22:29 »


Вот код метода rowCount()
Код:
int NetworkModelRO::rowCount(const QModelIndex &parent) const {
    slotSendToServer("length"); // посылаем серверу запрос на общее кол-во строк

// ответ считывается в переменную stringNetworkMessage
// (она определена в классе) из слота получения ответа от сервера
    int n = stringNetworkMessage.toInt(); 

    qDebug() << "stringNetworkMessage.toInt() => " << n;

    return n;
}


покажи код слота получения ответа от сервера
Записан
AlphaGh0St
Гость
« Ответ #9 : Июнь 30, 2011, 22:46 »

Вот код слота получения ответа от сервера
Код:
oid NetworkModelRO::slotReadyRead(){
    QDataStream in(socket);
    in.setVersion(QDataStream::Qt_4_7);

    for(;;){
        if(!nextBlockSize){
            if(socket->bytesAvailable() < sizeof(quint16))
                break;

            in >> nextBlockSize;
            }

        if(socket->bytesAvailable() < nextBlockSize)
            break;

        in >> stringNetworkMessage; // <---

        nextBlockSize = 0;
        }
}
Записан
AlphaGh0St
Гость
« Ответ #10 : Июль 01, 2011, 14:35 »

Есть какие-нибудь идеи? ... Непонимающий
Записан
BRE
Гость
« Ответ #11 : Июль 01, 2011, 14:41 »

Попробуй жестко забить в rowCount, что бы он возвращал 3 и посмотри, будет ли вызываться data.
Записан
ieroglif
Гость
« Ответ #12 : Июль 01, 2011, 14:45 »

а я бы не стал так на прямую обращаться в сеть из методов модели.
отдельный класс висит, работает с серваком.. как оттуда обновления-изменения есть - он подкешировал инфу, и отдал модели..
модель тогда работает быстро и чётко.
Записан
AlphaGh0St
Гость
« Ответ #13 : Июль 01, 2011, 15:25 »

Переписал метод rowCount() так, чтобы он возвращал 3. И, действительно, обмен данными пошёл, в представлении отобразились строки.  Но тут, к сожалению, тоже, не всё так гладко...

ieroglif, не могли бы Вы рассказать подробнее, желательно с практической точки зрения или предоставить информацию, для реализации описанного Вами метода ? (или пример).

Записан
AlphaGh0St
Гость
« Ответ #14 : Июль 01, 2011, 15:49 »

ieroglif, т.е. я правильно Вас понял?
Нужно написать отдельный класс, который возьмёт всё сетевое взаимодействие на себя.
В этом "сетевом" классе должны быть методы для получения общего кол-ва строк и получения строки по номеру.
Все полученные от сервера данные, сетевой класс хранит в своих полях.

А модель лишь запрашивает эти данные через методы rowCount() и data() у сетевого класса.

Тогда у меня ещё вопрос: каким образом подобный подход отразится на быстродействии модели?
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.07 секунд. Запросов: 21.