crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

История благодарностей участнику igor_bogomolov ::: Спасибо сказали: 235 раз(а)
Дата поста: В теме: За сообщение: Спасибо сказали:
27.3.2009, 14:22 Xml - обращение к дочернему элементу
Начну с того, что в приведенном Вами коде очень много ошибок, что очень неприятно при отладке. Надо быть поокуратнее.
Цитата
QDomElement QDomDocument::elementById ( const QString & elementId )

Returns the element whose ID is equal to elementId. If no element with the ID was found, this function returns a null element.

Since the QDomClasses do not know which attributes are element IDs, this function returns always a null element. This may change in a future version.

Т.е. насколько я понимаю, этот метод всегда вернет нулевой елемент.
Я сделал так:
    QDomElement docElem;
    QDomNodeList lstNodes(domDocument.elementsByTagName("page"));
        for (int n=0; n<lstNodes.count(); n++)
        {
            QDomElement childElem = lstNodes.at(n).toElement();
            if (childElem.attribute("id") == "page01")
            {
                QDomElement child = childElem.lastChild().toElement();
                qDebug() << child.text();
            }
        }

Данный код у меня работает. Может не самое оптимальное решение, кто знает как сделать лучше раскажите :rolleyes:
FladeX,
27.3.2009, 3:20 QTcpSocket и синхронный протокол
По поводу qWait(int msec) ничего сказать не могу, никогда ее не использовал. Хотя в ассистенте написано, что Gui и сетевой интерфейс она не блокирует. Правильно ли это тянуть с собой в приложении функционал из QTestLib?

Мне не совсем понятно, что значит "весь ответ". У Вас есть критерий, по которомы Вы можете определить, что все ожидаемые данные получены? Или единственным критерием будет являться то, что в соккет какое-то время данные не поступают.

В любом случае, я вижу только два пути. Первое - организовать все через блокирующую функцию waitForReadyRead(int msecs), т.е. примерно так
Раскрывающийся текст
const QStringList & getAnswer(const QString &cmd) {
    socket.write(qPrintable(cmd));
    socket.flush();

    QStringList strlist;
    forever {
        if(waitForReadyRead(1000)) {
            strlist << socket.read(socket.bytesAvailable());
        } else break;
    }
    return strlist;
}

Что, как сами понимаете, делать не стОит, т.к. Gui будет заблокированно на неопределенное время. (Хотя всегда можно добавить qApp->processEvents(). Но мне такой подход не нравится.)

Во втором случае - это, как уже предлогалось, сделать все это в дочернем потоке. Правда структура проекта будет несколько иной, что Вы изначально хотели.

Раскрывающийся текст
void ThreadSocket::run()
{
    QStringList strlist;
    emit SendServer("cmd"); // отправляем данные для записи в соккет
    QMutexLocker locker(&mutex);
    forever {
        if ( cond.wait(&mutex, 1000) ) {
            strlist << DataIn; //  DataIn - данные полученные по соккету, в обработчике события readyRead()
            DataIn.clear();
        } else break;
    }
    emit sendData(strlist); // отправляем полученные данные.
}

P.S. Коды не компилил. Надеюсь сильно нигде не облажался :rolleyes:
canavar,
22.3.2009, 19:25 Объявление для Qt RTT
Под Windows никаких проблем не возникло. Все отработало на ура, никаких проблем с отображением русского языка нет.
Спасибо вам :rolleyes:
Litkevich Yuriy,

9 страниц V  « < 7 8 9
RSS Текстовая версия Сейчас: 22.1.2021, 12:05