Просмотр сообщений
|
Страниц: 1 ... 18 19 [20] 21
|
288
|
Qt / Общие вопросы / Отключение компьютера
|
: Сентябрь 13, 2011, 11:29
|
Доброго дня всем Нужно написать программку отключения, перезагрузки и переход в спящий режим компьютера на Qt! Как это можно реализовать, по средством каких классов, функций, методов? Подскажите пожалуйста!
|
|
|
289
|
Qt / Вопросы новичков / Re: Выравнивание полей структуры
|
: Сентябрь 08, 2011, 12:48
|
сериализация в Qt - это и есть сохранение объектов в QDataStream?
Эээ, а ты правильно понимаешь сам процесс? В QDataStream ничего сохранить нельзя, он по сути сам "сохраняльшик в...". С его помощью можно сохранять данные в разные контейнеры, будь то файл, QByteArray, QBuffer... Мг..Понятно..А если скажем по-другому: "сериализация в Qt - это и есть сохранение объектов при помощи QDataStream?"
|
|
|
290
|
Qt / Вопросы новичков / Re: Выравнивание полей структуры
|
: Сентябрь 08, 2011, 12:35
|
Кстати, кто будет принимать данные на той стороне? какие ограничения на формат передаваемых данных накладывает приемник? а то можно воспользоваться более обобщенным транспортом. например JSON или XML.. даже если принимающая сторона требует только бинарные данные, то все равно должен быть договор о структуре: порядок байт, размеры типов и пр. в любом случае пересылать структуру как есть нецелесообразно.
Ура)) strcpy(objHead.name, str.toLocal8Bit().data()); решила все мои проблемы... пока! СПАСИБО! С toLocal8Bit().data() пробовал делать, но не так (( Что касается формата, то должно передаваться все: от .txt до mp3! В общем все) остальные предложения учту..
|
|
|
293
|
Qt / Вопросы новичков / Re: Выравнивание полей структуры
|
: Сентябрь 08, 2011, 10:30
|
QString str; //...................................... strcpy(objHead.name, str.toLocal8Bit().data());
Но, действительно, лучше воспользоваться сериализацией. если неохота в столбик запихивать в датастрим все поля по-очереди, то можно воспользоваться сериализацией наследников QObject или данные хранить в QVariantMap. В общем здесь много говорилось про сериализацию - надо почитать а то я смутно представляю что это такое, помню когда-то сериализовали элементы интерфейса на Java, но это было давно..Как это делается на Qt пока не представляю
|
|
|
294
|
Qt / Вопросы новичков / Re: Выравнивание полей структуры
|
: Сентябрь 08, 2011, 10:25
|
Если другая ошибка, то какая?!
чтобы понять нужен код упаковки и распаковки Киент передаетvoid FormCl::slotSendToServerFile() { QFile file(wayFile); QByteArray arrBlock, arrBlockText, arrBlockNameFile; headl objHead; objHead.titMsg = 2; int pos, k, i;
for(int i = wayFile.size()-1, j = 0; wayFile.at(i) != '/'; i--, j++) { pos = j; objHead.nameFile[i] = NULL; } for(i = wayFile.size()-1 - pos, k = 0; k < pos + 1; i++, k++) objHead.nameFile[k] = wayFile.at(i).toAscii(); // чтение из файла if(file.open(QIODevice::ReadOnly)) { objHead.sizeData = file.size(); arrBlockText = file.read(objHead.sizeData); arrBlock.append((const char*)&objHead, sizeof(objHead)); arrBlock.append(arrBlockText); m_pTcpSocket->write(arrBlock); file.close(); } }
Сервер принимает ......
while(true) { if(tcpSocket->state() == QAbstractSocket::ClosingState) break;
if(tcpSocket->waitForReadyRead(3000)) // bytesAvailable() { if(!flag) // false { // читаем переданную стуктуру! retrRead = tcpSocket->read((char*)&objHead,sizeof(objHead)); if( retrRead == -1) break; if( retrRead == 0) break; } switch(objHead.titMsg) { case 1: // передается сообщение { ..... break; } case 2: // передается файл { // запись в файл QFile file(objHead.nameFile); if(file.open(QIODevice::WriteOnly)) { if(tcpSocket->bytesAvailable() != objHead.sizeData) { flag = true; continue; } arrBlockText = tcpSocket->read(objHead.sizeData); file.write(arrBlockText); emit MessageClient(tcpSocket, "<b>\nSize file: </b>" + QString().setNum(objHead.sizeData) + " Byte", 2); emit msgToGUI(QTime::currentTime().toString()+" <b>File is sent</b>",2); flag = false; file.close(); } else { if(tcpSocket->bytesAvailable() != objHead.sizeData) { flag = true; continue; } tcpSocket->read(objHead.sizeData); flag = false; msgToGUI("<b>Error</b> of the determination of the file!",4); } break; } default: { continue; } } // switch() } // waitForReadyRead() } // while()
|
|
|
295
|
Qt / Вопросы новичков / Re: Выравнивание полей структуры
|
: Сентябрь 08, 2011, 10:01
|
Как заполняете name? [/quote]
Наверое не очень правильно..: QString str; for(...) { objHead.name[k] = str.at(i).toAscii(); } Желательно использовать наверное strcpy(), но что-то не получается у меня впихнуть туда и массив и QString.. Хотя, если пишу банально for(int k=0; k < 29; k++) { objHead.name[k] = 'e'; } тоже не работает... а если 27, то нормально..
|
|
|
296
|
Qt / Вопросы новичков / Re: Выравнивание полей структуры
|
: Сентябрь 08, 2011, 09:33
|
В данном конкретном случае все выравнивания дадут один и тот же результат (такой же как и без всякого выравнивания) И непонятно почему нормально работает, если name до 28 символов, а потом только 32, 36, 40 и т.д. ?? Другая ошибка (никак не связанная с выравниванием) Этот этап проходят все, и вначале всем кажется что стоит немного повозиться чтобы потом записать одной строкой напр так C++ (Qt) file.write(&theHead, sizeof(head));
Но рано или поздно все равно приходится писать/передавать каждый член структуры. Поэтому лучше рано Если другая ошибка, то какая?!А если большая структура, то наверное не очень рационально передавать отдельно каждое поле..Действитеьно, передаю похожим образом, только предварительно записываю в QByteArray: head objHead; QByteArray arrBl;
arrBl.append((const char*)&objHead,sizeof(objHead)); m_pTcpSocket->write(arrBl);
|
|
|
297
|
Qt / Вопросы новичков / Re: Выравнивание полей структуры
|
: Сентябрь 08, 2011, 09:23
|
попробуй объявить структуру так: C++ (Qt) #pragma pack(1) struct head { quint32 size; quint32 tit; char name[1024]; } #pragma pack()
Что-то похожее делал - не помогло и так тоже не работает..
|
|
|
298
|
Qt / Вопросы новичков / Выравнивание полей структуры
|
: Сентябрь 07, 2011, 16:05
|
Добрый день! Подскажите пожалуйста каким образом можно выровнять структуру, чтобы корректно ее передать по сети.. struct head { quint32 size; quint32 tit; char name[1024]; }
И непонятно почему нормально работает, если name до 28 символов, а потом только 32, 36, 40 и т.д. ??
|
|
|
299
|
Qt / Работа с сетью / Re: Чтение из сокета
|
: Сентябрь 05, 2011, 23:55
|
Vladimir, ты сейчас занес микроскоп над гвоздем и пытаешься всем объяснить, что молоток тебе не нужен. На самом деле в теме передачи структуры по сети очень много подводных камней. Это и выравнивание полей структуры и разный порядок хранения + необходимость перевода чисел в сетевой порядок. Опять же отправка объектов (тег же строк). QDataStream как раз и решает все эти проблемы. Понял почему дописывает левые символы - всё дело в структуре!
Нет, все дело в том, что так: QString wayFile;
objHead.name[i] = wayFile.at(i).toAscii();
с C-строками работать нельзя. Почитай про strcpy, strcmp, str* группу функций. Задание на работе такое дали сделать без QDataStream методами read()/write()! Тогда читать про все описанное выше: выравнивание полей структур, порядок байт (что-то я возможно еще упустил) и бороть самому. Исходники QDataStream в этом здорово помогут. "Vladimir, ты сейчас занес микроскоп над гвоздем и пытаешься всем объяснить, что молоток тебе не нужен." шикарно =)) про strcpy, strcmp в курсе - учту! "выравнивание полей структур" я и пытался сделать.. ну что-то безуспешно, либо читает с именем больше 32 символов, а меньше нет, либо наоборот..Значит, исходники QDataStream, а в книженциях каких это можно глянуть?!
|
|
|
300
|
Qt / Работа с сетью / Re: Чтение из сокета
|
: Сентябрь 05, 2011, 17:39
|
А почему вам не нужно QDataStream?
Задание на работе такое дали сделать без QDataStream методами read()/write()!
|
|
|
|
|