roboforum.ru

Технический форум по робототехнике.

Вопросы по Qt (ну и по С++ заодно)

Re: Вопросы по Qt (ну и по С++ заодно)

Angel71 » 10 мар 2011, 23:13

blindman, http://www.visualdata.ru/blog/109-segv-signal.html
:) а с кэтчами согласен, погорячился.

Re: Вопросы по Qt (ну и по С++ заодно)

dccharacter » 02 апр 2011, 15:23

Ребят, я, похоже тут развлекался со старыми версиями qextserialport. Сейчас собрал самую последнюю, но при сборке orfa-term нме пишут следующее:

:: error: No rule to make target `e:/Qt/2010.05/qt/include/qextserialport-build-desktop/build/qextserialportd.prl', needed by `makefile'. Stop.

при этом проект qextserial вообще закрыт. Все файлы из директории BUILD qextserial скопированы в директорию orfa-term, он их видит. (кстати, нифига не работают у меня переменные окружения - я добавляю пути и как user path, и как system path, но в итоге все равно приходится все библиотеки, типа qt4_gui весом по 50-150МБ каждая копировать в папку сборки проекта - что за нафик?).

Добавлено спустя 1 час 10 минут:
Вчсе, решил - выпилил из make-файла все упоминания qextserial. собралось.

Но все равно в каждую билд-директорию надо копировать QT-шные и другие библиотеки, иначе не работает. Как это побороть?

Re: Вопросы по Qt (ну и по С++ заодно)

dccharacter » 07 апр 2011, 13:16

Что-то не спешит коллективный мозг на помощь. Но может хоть с этим поможете:

1. У меня контроллер и ПК обмениваются командами длиной 4 байта. Команда начинается либо с 's', либо с 'g' (set/get), дальше идет адрес регистра в управляющем блоке, значение регистра (для команты get - это don't care character), заканчивается 'p'.

2. Я на QT как-то имхо убого формирую команду - работает, но мне не очень нравится.
Код: Выделить всёРазвернуть
QString cmd;
cmd.append('s').append(0x05).append(0x4A).append('p');

Можно ли как-то сделать лучше/правильней/и т.д.??

3. А вот с приемкой и, главное, отображением - вообще кисляк:
3а. Если просто показываю полученную команду, то что адрес, что значение - могут быть любыми символами, в т.ч. таб, черточки, палочки и т.д. - наверное надо как-то парсить команду и отображать в человековаримом виде...
3б. Если надо отобразить значение value:
Код: Выделить всёРазвернуть
QByteArray cmd;
cmd = serialPort->readAll(); //сразу в стринг не могу читать, потому что значения могут быть в т.ч. и нулевые, что автоматом нуль-терминирует строку
QString cmd_str;
cmd_str.setNum(cmd.at(2)); //вот тут большая часть значений показывается ОК, но на некоторых значениях value строка принимает какое-то непонятное значение (думаю - 127 что ли...), но понять причину этого не могу. Это чаще всего происходит в начале диапазона, т.е. от 0x00 и до, скажем навскидку 0x30, и несколько раз проскакивает ближе к концу диапазона...

Re: Вопросы по Qt (ну и по С++ заодно)

algol » 31 май 2011, 12:58

dccharacter писал(а):2. Я на QT как-то имхо убого формирую команду - работает, но мне не очень нравится.
Код: Выделить всёРазвернуть
QString cmd;
cmd.append('s').append(0x05).append(0x4A).append('p');

Можно ли как-то сделать лучше/правильней/и т.д.??


Код: Выделить всёРазвернуть
QString str;
quint8 x=0x05,y=0x4A;
str.append(QString("s%1%2p").arg(x).arg(y));
qDebug()<<str;


Возможно так будет лучше?

Re: Вопросы по Qt (ну и по С++ заодно)

dccharacter » 04 авг 2011, 00:08

Народ, что-то опять те же грабли. Не могу показать два байта в виде числа на лейбл.

Есть QByteArray, первые два байта равны 00h 1eh (т.е. если выводить QByteArray.toHex(), то кажет 001ехххххх). Теперь надо показать это в виде числа на лейбл. Сделал label->setNum(QByteArray->left(2).toInt()) - чего-то постоянно 0 показывает. Ну и так и сяк пробую - либо ничего не показывает (ну, точнее в АСКИИ), либо 0. Если же взять label->setNum(QByteArray->at(1)), то показывает нормально циферку 30.

Добавлено спустя 1 час 4 минуты 56 секунд:
Твою ж мать! 2 часа!
ui->outputVoltageValue->setNum(fromSerialPort->left(2).toHex().toInt(0,16));

Re: Вопросы по Qt (ну и по С++ заодно)

Grem » 04 авг 2011, 00:46

Т.е просто QByteArray->left(2).toInt(0, 16) не катит?

Re: Вопросы по Qt (ну и по С++ заодно)

dccharacter » 04 авг 2011, 01:50

нет!
т.е. оно не может перевести, скажем 'a' в 97. Оно может только 'a'->61h->97

Добавлено спустя 1 минуту 16 секунд:
ну т.е. если бы там было '2' или "234", то оно бы перевело toInt-ом сразу в 2 и 234 соответственно, а вот на "018f" уже фейлится.

Re: Вопросы по Qt (ну и по С++ заодно)

blindman » 05 авг 2011, 06:45

Код: Выделить всёРазвернуть
#include <QtEndian>
ui->outputVoltageValue->setNum(qFromBigEndian<quint16>((const uchar*)fromSerialPort->constData()));


fromSerialPort должен содержать не менее 2 байт

Re: Вопросы по Qt (ну и по С++ заодно)

dccharacter » 05 авг 2011, 11:25

:-( А у меня совсем неправильно?
А я правильно понимаю, что твой пример - он с перестановкой байт и т.д.?

Re: Вопросы по Qt (ну и по С++ заодно)

blindman » 05 авг 2011, 12:15

Правильно, но неэффективно. У меня все преобразование выглядит вот так:

Код: Выделить всёРазвернуть
    qDebug("%d", qFromBigEndian<quint16>((const uchar*)ba->constData()));
8054394:   8b 45 dc                mov    -0x24(%ebp),%eax
8054397:   89 04 24                mov    %eax,(%esp)
805439a:   e8 ff 67 00 00          call   805ab9e <_ZNK10QByteArray9constDataEv>
805439f:   89 04 24                mov    %eax,(%esp)
80543a2:   e8 38 c8 00 00          call   8060bdf <_Z14qFromBigEndianItET_PKh>
80543a7:   0f b7 c0                movzwl %ax,%eax
80543aa:   89 44 24 04             mov    %eax,0x4(%esp)
80543ae:   c7 04 24 6d 2c 08 08    movl   $0x8082c6d,(%esp)
80543b5:   e8 46 f2 ff ff          call   8053600 <_Z6qDebugPKcz@plt>

0805ab9e <_ZNK10QByteArray9constDataEv>:
inline const char *QByteArray::data() const
{ return d->data; }
inline const char *QByteArray::constData() const
{ return d->data; }
805ab9e:   55                      push   %ebp
805ab9f:   89 e5                   mov    %esp,%ebp
805aba1:   8b 45 08                mov    0x8(%ebp),%eax
805aba4:   8b 00                   mov    (%eax),%eax
805aba6:   8b 40 0c                mov    0xc(%eax),%eax
805aba9:   5d                      pop    %ebp
805abaa:   c3                      ret   
805abab:   90                      nop

08060bdf <_Z14qFromBigEndianItET_PKh>:
        | src[0] * quint32(0x01000000);
}

template<>
inline quint16 qFromBigEndian<quint16>(const uchar *src)
{
8060bdf:   55                      push   %ebp
8060be0:   89 e5                   mov    %esp,%ebp
    return quint16( 0
                    | src[1]
8060be2:   8b 45 08                mov    0x8(%ebp),%eax
8060be5:   83 c0 01                add    $0x1,%eax
8060be8:   0f b6 00                movzbl (%eax),%eax
                    | src[0] * quint16(0x0100));
8060beb:   0f b6 d0                movzbl %al,%edx
8060bee:   8b 45 08                mov    0x8(%ebp),%eax
8060bf1:   0f b6 00                movzbl (%eax),%eax
8060bf4:   0f b6 c0                movzbl %al,%eax
8060bf7:   c1 e0 08                shl    $0x8,%eax
8060bfa:   09 d0                   or     %edx,%eax
}
8060bfc:   5d                      pop    %ebp
8060bfd:   c3                      ret   

то есть всего 3 десятка команд.

А вызовы left() и toHex() каждый создают экземпляры класса QByteArray (причем не 2, как может показаться, а больше), с выделением памяти и последующем удалением.

Насчет того, будут ли переставляться байты - зависит от того, под какой процессор компилируется. У тебя, как я понял, данные передаются как big endian (сначала старший байт), поэтому и использована qFromBigEndian(). Это шаблонная функция, которая учитывает тип возвращаемого значения и порядок байтов целевого процессора

Re: Вопросы по Qt (ну и по С++ заодно)

dccharacter » 05 авг 2011, 12:20

ё-мае. спасибо
через пару лет я пойму, что ты мне написал :-)

Re: Вопросы по Qt (ну и по С++ заодно)

dccharacter » 27 окт 2011, 21:35

Помогайте ПЛЗ. Пытаюсь создать диалоговое окно, смотрю вот на этот пример http://doc.qt.nokia.com/vs-add-in-1.1.7 ... ess-dialog:
Код: Выделить всёРазвернуть
 AddDialog dialog(this);

if (dialog.exec()) {
             QString name = dialog.nameEdit->text();
             QString email = dialog.emailEdit->text();

             if (!name.isEmpty() && !email.isEmpty()) {
                     QListWidgetItem *item = new QListWidgetItem(name, ui.addressList);
                     item->setData(Qt::UserRole, email);
                     ui.addressList->setCurrentItem(item);
             }
     }


У меня есть две формы - mainwindow.ui, dialog.ui. Объект класса Dialog является членом класса MainWindow:
Код: Выделить всёРазвернуть
class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
    Dialog *settingsDialog;
};


Создаем объект в конструкторе:
Код: Выделить всёРазвернуть
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    settingsDialog = new Dialog(this);
}


Проблема - объект MainWindow не видит объекты-члены settingsDialog (что, вроде как логично). На форумах говорят, что мол делай для каждого поля окна настроек метод, возвращающий значение. По логике я могу сделать метод класса Dialog, который при нажатии кнопки ОК будет ссыпать все настройки в файл настроек. А MainWindow будет оттуда настройки читать. Но я точно знаю, что Dead каким-то образом в orfa-terminal делал по-человечески, т.е. из методов MainWindow есть доступ к методам Dialog - но я уже всю бошку об стол разбил - не пойму как это сделано.

Re: Вопросы по Qt (ну и по С++ заодно)

Grem » 27 окт 2011, 21:43

Вообще то геттеры и сеттеры спасут вас. Это и есть правильное решение :)

Добавлено спустя 1 минуту 10 секунд:
я уже всю бошку об стол разбил - не пойму как это сделано.

Потому что начинать надо было с основ, а не с фреймворка.

Re: Вопросы по Qt (ну и по С++ заодно)

dccharacter » 28 окт 2011, 00:06

Спасибо, будем сетать и гетать.
Я просто не поверил, что это на самом деле так.

Добавлено спустя 2 часа 12 минут 46 секунд:
ё-маё, кажись мне удалось вывихнуть мозг нужным образом... тут главное понять - кто папа, а кто мама.

Re: Вопросы по Qt (ну и по С++ заодно)

Grem » 28 окт 2011, 00:53

К стати, в этих ваших плюсах нельзя что ли в конструктор к dialog передать ссылку на mainwindow, чтоб через нее обращаться к приватным полям? Так тоже удобно, но не совсем правильно.


Rambler\'s Top100 Mail.ru counter