LINUX.ORG.RU

Пара вопросов по QT 4.4


0

0

1. Нужно прочитать данные из бин. файла filename
QVector<quint32> vec (4);

file.setFileName(filename);
file.open(QIODevice::ReadOnly);
QDataStream in(&file);
in >> vec;

Проблема в том, что в vec[0] содержится второе 32-битное слово из
файло, т.е. как будто перед вычитыванием был сделан seek со смещением
в 4 байта. Хотя in >> vec[0]; - OK, но нужно вычитать массив. Почему
так ? И как победить ?

2. Есть массив данных, нужно их отобразить, например, с помощью
QPainter drawLine по точкам в виде графика. Но кол-во данных больше, чем ширина отображаемой области в пикселах. Как _средствами_QT_! отобразить этот массив, чтоб он весь влез, с потерями, конечно (типа промасштабировать как-нить) ?


1. А записывали файл тем же QDataStream'ом? Подозреваю, у него свои представления о том, как хранить вектор...

const86 ★★★★★
()
Ответ на: комментарий от const86

> 1. А записывали файл тем же QDataStream'ом? Подозреваю, у него свои представления о том, как хранить вектор...

Нет, записан был совсем другим способом. А вот
in.readRawData ( (char *) pqd, N ); (где pqd итератор) все ОК.

drZlo
() автор топика

1) QVector сериализуется в структуру, в которой первым элементом идёт размер вектора, потом идут элементы.

alex_custov ★★★★★
()
Ответ на: комментарий от drZlo

>>Нет, записан был совсем другим способом. А вот in.readRawData ( (char *) pqd, N ); (где pqd итератор) все ОК.

Это значит что у тебя в файле обычный бинарный блоб, а не сериализованный вектор.

http://doc.trolltech.com/4.4/datastreamformat.html

alex_custov ★★★★★
()

> Но кол-во данных больше, чем ширина отображаемой области в пикселах. Как _средствами_QT_! отобразить этот массив, чтоб он весь влез, с потерями, конечно (типа промасштабировать как-нить) ?

Посмотри в доке на QT - QPainer; используй для отрисовки координаты с float point, а не целочисленные, и включи антиалиасинг (только учти, что тогда координаты у тебя будут дополнительно добавлены +0.5 - т.е. отрисовка с целочисленной координатой по Y 1.0 у тебя отрисует вертикальную линию с шириной в два пикселя с заливкой 0.5, а Y=1.5 - с шириной в один пиксель и плотностью заливки 1.0 - лечится принудительным смещением координат на 0.5) - антиалиасинг: QPainer_object.setRenderHint(QPainer::Antialiasing, true); смещение координат:

QTransform transform;

transform.translate(0.5, 0.5);

QPainer_object.setWorldTransform(transform);

P.S. совет - раздобудь книгу "C++ GUI Programming with QT4, second edition" - там много полезных вещей описано, которые не сразу вкуришь по доке из комплекта.

Spectr ★★★
()

> с потерями, конечно (типа промасштабировать как-нить) ?

ах, да - тогда не надо смещать в QTransform (всё равно будет мешанина из сглаженных пикселей), а просто сделай transform.scale(xs, ys); на коэффициенты как тебе надо.

Spectr ★★★
()
Ответ на: комментарий от Spectr

бррр... можешь ещё попробовать толщину линий тоже уменьшить на тот же коэффициент... QPainter::setPen(QPen::setWidthF())

Spectr ★★★
()

> 2. Как _средствами_QT_! отобразить этот массив, чтоб он весь влез, с потерями, конечно (типа промасштабировать как-нить) ?

Ну если нужно прям средствами Qt, то сгенерировать картинку из этих данных и потом отображать её. Qt её "промасштабирует" тебе, чтоб она помещалась в окне :-) см. QPicture, QImage etc. и QPainter::drawImage методы.

smh ★★★
()
Ответ на: комментарий от smh

> Ну если нужно прям средствами Qt, то сгенерировать картинку

Наверное не прокатит, т.к. надо будет еще изменять ее размеры в окне отображения, например, выдилить мышью участок и чтоб он увеличился (стал на все окно изображения), потом вернуться назад (все данные в окне) и т.д.

drZlo
() автор топика

Еще несколько вопросов:

Для класса QMainWindow

1. Как сделать, чтоб окно не изменяла размер. В заголовке окна была
только кнопка "Х" закрыть ? Средствами QT Designer'a или в коде.

2. Как вообще убрать заголовок окна ?

drZlo
() автор топика
Ответ на: комментарий от drZlo

В конструктор добавь setFixedSize( width, height ), убрать рамку - setWindowFlags( Qt::FramelessWindowHint )

summatus
()

> file.setFileName(filename); > file.open(QIODevice::ReadOnly);

А вот как в QT замапить файл, чтоб потом через указатель по нем прыгать, а не seek, типа mmap ?

drZlo
() автор топика
Ответ на: комментарий от summatus

А для работы (перемещение по файлу для извлечения данных) с этим указателем (map) у QT есть какие-то свои методы или постаринке ?

drZlo
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.