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

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: 1 ... 18 19 [20] 21
286  Qt / Общие вопросы / Re: Отключение компьютера : Сентябрь 13, 2011, 11:39
Кури WinAPI или заюзай команду shutdown.

пошел курить  Смеющийся
287  Qt / Общие вопросы / Re: Отключение компьютера : Сентябрь 13, 2011, 11:35
Под каждую платформу писать отдельное решение.

Нужно под Windows
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! В общем все) остальные предложения учту..
291  Qt / Вопросы новичков / Re: Выравнивание полей структуры : Сентябрь 08, 2011, 11:16
http://doc.qt.nokia.com/4.7/datastreamformat.html
Но первое же предложение тебя удивит.


Ну да) значит, сериализация в Qt - это и есть сохранение объектов в QDataStream?
292  Qt / Вопросы новичков / Re: Выравнивание полей структуры : Сентябрь 08, 2011, 10:55
Надо без QDataStream.. Подскажите, где можно почитать про сериализацию в Qt, что-то не могу ничего толкового найти Плачущий
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()!
Страниц: 1 ... 18 19 [20] 21

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