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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: С конструктором помогите  (Прочитано 7477 раз)
CJ1
Гость
« : Июнь 16, 2012, 09:03 »

Вобщем в объекте главного окна добавляю

Код:
private:

    QByteArray block2;
    QDataStream out2;


В функции нужно как бы инициализировать out2 но не получается!

Код:
void EditTable::on_action_2_triggered()
{
    out2 = QDataStream(&block2,QIODevice::WriteOnly);

    import dlg(this);
    dlg.exec();

    block2.clear();
}

out2 = QDataStream(&block2,QIODevice::WriteOnly);
Дает ошибку, но это не правильно я знаю, но как подругому сделать?
Записан
mutineer
Гость
« Ответ #1 : Июнь 16, 2012, 09:56 »

void QDataStream::setDevice ( QIODevice * d )

или создавать QDataStream динамически
Записан
CJ1
Гость
« Ответ #2 : Июнь 16, 2012, 09:59 »

Я так и сделал QDataStream * out2
Теперь добавляю данные вот так *out2 << "asd";

Правильно?
Записан
mutineer
Гость
« Ответ #3 : Июнь 16, 2012, 10:03 »

Я так и сделал QDataStream * out2
Теперь добавляю данные вот так *out2 << "asd";

Правильно?

Если работает, то ответ очевиден, если не работает - рассказывай как не работает
Записан
CJ1
Гость
« Ответ #4 : Июнь 16, 2012, 10:20 »

Вобщем, люди, давайте я постараюсь объяснить все заного, я уже двое суток с этим борюсь!

Смотрите, я беру данные с excel, думаю тут код не нужно писать, так как все проходит ровно!
Во время заполнения я сразу эти данные кидаю в QTableWidget

Далее срабатывает вот это событие

Код:
void EditTable::on_tableWidget_cellChanged(int row, int column)
{
    if (alledit){
       // QMessageBox::information(0,"","alledit");
        *out2 << qint8('Y');
        *out2 << ui->tableWidget->item(row,0)->text();
        *out2 << ui->tableWidget->item(0,column)->text();
        *out2 << ui->tableWidget->item(row,column)->text();
        if (column < 5){
            *out2 << qint8('1');
        } else{
            *out2 << qint8('2');
        }
        can_do = true;
    }
   
}

Оно записывает в эти out ы данные.
Когда запишутся вызывается вот это
Код:
void EditTable::on_action_2_triggered()
{
    *out2 << qint8('N');
    if (alledit == false){
        QMessageBox::information(0,"отправка блока",block2.toHex());
        _sock->write(block2);

    } else alledit = false;
    block2.clear();
}

И вот тут начинаются косяки.

Постараюсь объяснить на пальцах какие.

Вот выполнилось все что я сказал выше.
На сервак ничего не попало!

Ладно....

Начинаю в своей проге, обращатся к серваку, разными способами, но мои обращения, он не видит, а за место них видит то что я послал тут _sock->write(block2); (чууть выше код)

Ну вобщем вот так! Как еще это объяснить я не знаю. На Win API я никогда не встречал подобного! Как это решается....
Записан
CJ1
Гость
« Ответ #5 : Июнь 16, 2012, 10:22 »

Чуть не забыл! ОШИБКИ НЕ ВОЗВРАЩАЕТ!!!!
Записан
mutineer
Гость
« Ответ #6 : Июнь 16, 2012, 10:24 »

_sock->flush() попробуй делать после записи в сокет
Записан
CJ1
Гость
« Ответ #7 : Июнь 16, 2012, 10:24 »

Ставлю гребанные QMessageBox между кодом и все отлично работает!
Записан
CJ1
Гость
« Ответ #8 : Июнь 16, 2012, 10:27 »

_sock->flush() попробуй делать после записи в сокет

_sock->flush() попробуй делать после записи в сокет

А где именно, в цикле?ч
Записан
CJ1
Гость
« Ответ #9 : Июнь 16, 2012, 10:37 »

Куда только не ставил не действует!
Записан
CJ1
Гость
« Ответ #10 : Июнь 16, 2012, 10:41 »

Вот хоть убей его, а QmessageBox ставишь, и постоянно ОК жмешь и все как по маслу идет!
Код:
void EditTable::on_tableWidget_cellChanged(int row, int column)
{

    if (edit){
         QByteArray block;
        QDataStream out(&block,QIODevice::WriteOnly);
        out.setVersion(QDataStream::Qt_4_7);
        out <<quint8('U');
        out <<quint8('A');
        out << ui->tableWidget->item(row,0)->text();
        out << ui->tableWidget->item(0,column)->text();
        out << ui->tableWidget->item(row,column)->text();
        if (column < 5){
            out << qint8('1');
        } else{
            out << qint8('2');
        }

        QMessageBox::information(0,"",block);
        int size = _sock->write(block);
        _sock->flush();




    }
    can_do = true;
Записан
CJ1
Гость
« Ответ #11 : Июнь 16, 2012, 10:42 »

Я не пойму, ну почему соккет работает ассинхронно! Мне это не надо! Работал бы синхронно и не возвращал бы управления пока все не отправит!
Записан
alexis031182
Гость
« Ответ #12 : Июнь 16, 2012, 10:54 »

QAbstractSocket::waitForBytesWritten()
Записан
CJ1
Гость
« Ответ #13 : Июнь 16, 2012, 10:57 »

Сделал так,
Код:
        int size = _sock->write(block);
        _sock->flush();
        while (!_sock->waitForBytesWritten(-1)){
             _sock->flush();
        }

Теперь не все отсылаются, хотя и отсылаются
Записан
alexis031182
Гость
« Ответ #14 : Июнь 16, 2012, 11:07 »

Уберите "-1"
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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