Russian Qt Forum

Qt => Вопросы новичков => Тема начата: kruft от Май 21, 2014, 09:08



Название: Получение данных из QLineEdit
Отправлено: kruft от Май 21, 2014, 09:08
День добрый!

В QLineEdit пользователь вводит число в шестнадцатеричке, необходимо преобразовать строку в число,а затем преобразовать число в массив типа char.
Пытался вот так, но не выходит.
   
Код:
    QString inval = ui->inputLINE->text();
    quint32 val = inval.toUInt(NULL, 16);
    QByteArray ba = inval.toLocal8Bit();
    qDebug() << ba[0];
   


Название: Re: Получение данных из QLineEdit
Отправлено: OKTA от Май 21, 2014, 09:22
Код:
char * QByteArray::data ()
Returns a pointer to the data stored in the byte array. The pointer can be used to access and modify the bytes that compose the array. The data is '\0'-terminated, i.e. the number of bytes in the returned character string is size() + 1 for the '\0' terminator.

const char * QByteArray::constData () const
Returns a pointer to the data stored in the byte array. The pointer can be used to access the bytes that compose the array. The data is '\0'-terminated unless the QByteArray object was created from raw data. The pointer remains valid as long as the byte array isn't reallocated or destroyed.
This function is mostly useful to pass a byte array to a function that accepts a const char *.
Note: A QByteArray can store any byte values including '\0's, but most functions that take char * arguments assume that the data ends at the first '\0' they encounter.


Название: Re: Получение данных из QLineEdit
Отправлено: kruft от Май 21, 2014, 09:33
И как в итоге должно получиться? С учётом того, что пользователь вводит например 1020 и это должно восприниматься как 0x10, 0x20 в массиве.


Название: Re: Получение данных из QLineEdit
Отправлено: OKTA от Май 21, 2014, 10:26
Вы уж определитесь, что вам нужно, а то в первом сообщении одно, в коде другое, а теперь третье..
Чтобы в массиве лежали 0x10 и 0x20, надо отдельно эти 0х10 и 0х20  добавлять. Например через .append(0x20). Сразу добавить 1020 в массив не получится. Точнее получится, но сохранится только первый байт из всего числа.


Название: Re: Получение данных из QLineEdit
Отправлено: kruft от Май 21, 2014, 10:33
Т.е. если пользователь ввёл например 10203040, то разбить строку на 0x10, 0x20, 0x30, 0x40 сразу никак не получится?
Ну допустим перед разбиением конвертируем через toUint(NULL, 16). Т.е. как будет выглядеть код если на входе 10203040, а на выходе нужен массив 0x10, 0x20...


Название: Re: Получение данных из QLineEdit
Отправлено: OKTA от Май 21, 2014, 10:54
Сначала разбей строку(типа "10203040") на подстроки ("10", "20", "30", "40"), переведи каждую в int и добавляй в массив.


Название: Re: Получение данных из QLineEdit
Отправлено: kruft от Май 21, 2014, 11:05
А как проще всего сделать разбиение на подстроки?


Название: Re: Получение данных из QLineEdit
Отправлено: carrygun от Май 21, 2014, 11:12
Очевидно что boost::spirit.


Название: Re: Получение данных из QLineEdit
Отправлено: OKTA от Май 21, 2014, 11:26
 ??? я конечно все понимаю, но пройтись по строке и выцеплять символы по паре можно без всяких духов  ;D ;D
Код:
QString dataString("10245634f");
    QStringList list;
    int i = 0;
    QString tmpString;
    while(0 != (tmpString = dataString.mid(i, 2))) {
        //

        list.append(tmpString);
        i +=2;
    }


Название: Re: Получение данных из QLineEdit
Отправлено: carrygun от Май 21, 2014, 11:51
Использовать QString сейчас не профессионально, ходят слухи, что даже не законно.


Название: Re: Получение данных из QLineEdit
Отправлено: OKTA от Май 21, 2014, 11:54
Предъявите ваши доказательства  ;D


Название: Re: Получение данных из QLineEdit
Отправлено: kruft от Май 21, 2014, 11:55
Был бы какой-нить разделитель было бы просто очень. А так спасибо сделаю. Только мне придётся сначала строку конвертировать в uint,а потом уже с ней работать, чтобы hex был hex.


Название: Re: Получение данных из QLineEdit
Отправлено: kruft от Май 21, 2014, 12:28
А ещё вопрос. Т.е. массив типа string получен, как его преобразовать в массив типа QByteArray?


Название: Re: Получение данных из QLineEdit
Отправлено: OKTA от Май 21, 2014, 12:29
А чем аргументирован отказ от QString в пользу std::string?


Название: Re: Получение данных из QLineEdit
Отправлено: kruft от Май 21, 2014, 12:38
В полученном массиве будут лежать при вводе 1A1B1C не числа 0x1A, 0x1B, а значения ASCII символов?
Код:
QByteArray out_val;
foreach (QString str, list) {
            uint value = str.toUInt(NULL, 16);
            out_val = (quint8)value;
        }
Не получается перевести в char каждую строчку


Название: Re: Получение данных из QLineEdit
Отправлено: OKTA от Май 21, 2014, 12:41
Без преобразований каких-либо да, ASCII-код.

out_val в коде перезаписывается на каждой итерации..


Название: Re: Получение данных из QLineEdit
Отправлено: kruft от Май 21, 2014, 13:20
Ага забыл про append.
Вот что в итоге получилось:

Код:
        QByteArray out_val;
        QString dataString(ui->inputLINE->text());
        QStringList list;
        int i = 0;
        QString tmpString;
        while(0 != (tmpString = dataString.mid(i, 2))) {
            list.append(tmpString);
            i +=2;
        }
        foreach (QString str, list) {
            uint value = str.toUInt(NULL, 16);
            out_val.append((quint8)value);
        }
        qDebug()<<out_val.toHex();
        quint32 abc;
        abc = out_val[0]+ out_val[1];
        qDebug()<<abc;


Название: Re: Получение данных из QLineEdit
Отправлено: OKTA от Май 21, 2014, 13:28
Работает?
Можно избавиться от QStringList и foreach, если делать манипуляции с подстроками в while.


Название: Re: Получение данных из QLineEdit
Отправлено: kruft от Май 22, 2014, 08:07
Код:
QByteArray out_val;
    QString dataString(ui->inputLINE->text());
          int i = 0;
          QString tmpString;
          while(0 != (tmpString = dataString.mid(i, 2))) {
              out_val.append((quint8)(tmpString.toUInt(NULL, 16)));
              i +=2;
          }

Да вот так тоже работает, спасибо за помощь