На главную... Продукты | Технологии | Классификаторы | Проекты | Скачать | Цены| Форум | Статьи | Обучение | Контакты

Кроссплатформенное приложение Qt+MAPAPI

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: 1 2 След.
RSS
Кроссплатформенное приложение Qt+MAPAPI
 
Интересный эффект получился, вот этот код под Windows+GTK14 отображает карту, а он же под Astra Linux SE  + GTK12 дает белый экран.
Код в основном слизан с GTK12 Astra Linux
Код
void uxMapView::DrawContents(QPainter *p, int cx, int cy, int cw, int ch)
{
    if (!hMap) {
        // Очистить экран
        QBrush brush( Qt::white);
        p->setBrush( brush );
        p->drawRect( cx, cy, cw, ch );
        p->drawText(QRectF(cx, cy, cw, ch),"Карта не открыта",QTextOption(Qt::AlignHCenter | Qt::AlignVCenter));
        return;
    }


    RectDraw.setLeft(cx);
    RectDraw.setTop(cy);
    RectDraw.setRight(cx + cw);
    RectDraw.setBottom(cy + ch);


    VScrollBar->setEnabled(false);
    HScrollBar->setEnabled(false);


    POINT point1;
    point1.x    = 0;
    point1.y    = 0;


    RECT rect;
    rect.left   = VarHorzPos;
    rect.right  = VarHorzPos + mapViewPort->width();
    rect.top    = VarVertPos;
    rect.bottom = VarVertPos + mapViewPort->height();


    // Проверить размеры буфера изображения
    if (mapGetImageWidth(hScreen) < mapViewPort->width() || mapGetImageHeight(hScreen) < mapViewPort->height())
    {
      mapChangeImageSizeEx(hScreen, 1, mapViewPort->width(), mapViewPort->height());
      mapDrawImageMap(hScreen, hMap, &rect, &point1);
    }


/*
    point1.x    = 0;
    point1.y    = 0;
    rect.left   = VarHorzPos;
    rect.right  = VarHorzPos + mapViewPort->width();
    rect.top    = VarVertPos;
    rect.bottom = VarVertPos + mapViewPort->height();
    mapDrawImageMap(hScreen, hMap, &rect, &point1);
*/
    RECT maprect;
    maprect.left     = RectDraw.left() + HScrollBar->value();
    maprect.top      = RectDraw.top() + VScrollBar->value();
    maprect.right    = RectDraw.right() + HScrollBar->value();
    maprect.bottom   = RectDraw.bottom() + VScrollBar->value();


    UpdateScreenImageBuffer(hScreen);
    // Отобразить принятый буфер
    p->drawImage(0, 0, ScreenImageBuffer);




    VScrollBar->setEnabled(true);
    HScrollBar->setEnabled(true);
}


void uxMapView::UpdateScreenImageBuffer(HIMAGE hScreen)
{
    long imageWidth = mapGetImageWidth(hScreen);
    long imageHeight = mapGetImageHeight(hScreen);


    if (ScreenImageBuffer.width() != imageWidth || ScreenImageBuffer.height() != imageHeight)
    {
        // Reallocate image
        ScreenImageBuffer = QImage(imageWidth, imageHeight, QImage::Format_RGB32);
    }


    if (ScreenImageBuffer.isNull() == false)
    {
        XIMAGEDESC ximage;
        ximage.Height = ScreenImageBuffer.height();
        ximage.Width = ScreenImageBuffer.width();
        ximage.RowSize = ScreenImageBuffer.bytesPerLine();
        ximage.Depth = ScreenImageBuffer.depth();
        ximage.CellSize = ScreenImageBuffer.bytesPerLine() / ScreenImageBuffer.width();
        ximage.Point = (char*)ScreenImageBuffer.bits();
        mapViewImageToXImage(hScreen, &ximage, 0, 0);
    }
}
Вызов
Код
 mapDrawImageMap(hScreen, hMap, &rect, &point1)
делается из событий Resize и изменений позиций ScrollBar-ов.
Изменено: Валерий Парусов - 11.05.2022 09:28:01
 
Ради интереса сделал отдельный код, в Windows отображает кусок карты, в Linux - белая заливка.
res в обоих случаях =1
Код
void MainWindow::on_btDummy_clicked()
{
    HIMAGE img=mapCreateImageEx(500,500);
    mapClearMapScreen(img);
    POINT point1;
    RECT rect;

    point1.x   = 0;
    point1.y=0;
    int l,t;
    long res=0;
    vMap->GetMapLeftTop(&l,&t);

    rect.left=l;
    rect.top=t;
    rect.right=l+500;
    rect.bottom=t+500;

    res=mapDrawImageMap(img, vMap->mapHandle(), &rect, &point1);

    QImage ScreenImageBuffer = QImage(500, 500, QImage::Format_RGB32);
    XIMAGEDESC ximage;
    ximage.Height = ScreenImageBuffer.height();
    ximage.Width = ScreenImageBuffer.width();
    ximage.RowSize = ScreenImageBuffer.bytesPerLine();
    ximage.Depth = ScreenImageBuffer.depth();
    ximage.CellSize = ScreenImageBuffer.bytesPerLine() / ScreenImageBuffer.width();
    ximage.Point = (char*)ScreenImageBuffer.bits();
    res=mapViewImageToXImage(img, &ximage, 0, 0);
    ScreenImageBuffer.save("./_img.bmp","BMP");

    mapCloseImage(img);
}
Изменено: Валерий Парусов - 11.05.2022 14:57:48
 
Здравствуйте!

Провели тестирование присланного кода в сертифицированной версии ГИС Конструктор 12, добавив его в пример myfirst. На выходе получили картинку с частью карты.

Для дальнейшего тестирования, пожалуйста, укажите конкретную используемую версию ГИС Конструктор и предоставьте данные, на которых воспроизводится данная проблема.
Данные можно прислать на почту panorama@gisinfo.ru с ссылкой на сообщение с форума.

 
Карту и свой проект отправил.

У меня в  myFirst тоже работает с моей картой. А вот когда все сделано на чистом MAPAPI - нет.
Видимо где-то что-то в GTK12 надо еще делать, что в GTK14 сделано на автомате.
Проект-то просто из Windows на виртуалку копирую и запускаю.
Изменено: Валерий Парусов - 11.05.2022 18:37:37
 
Мое предположение подтверждается.
Если сделать так
Код
void MainWindow::on_btDummy_clicked()
{
    QDMapView *aMap = new QDMapView(this);
    delete aMap;

    //и дальше, как было
    HIMAGE img=mapCreateImageEx(500,500);
т.е. при уже открытой карте создать компонент GTK, то все начинает отображаться и в дальнейшем.
Получается что-то при создании компонента в MAPAPI происходит загадочное.
Изменено: Валерий Парусов - 12.05.2022 06:29:17
 
Провели проверку на предоставленных данных, перенеся код отображения части карты в новый проект без использования библиотеки компонентов. Код успешно отработал.

Предположительно, рисование белого фона было вызвано тем, что отображение идет в принтерном виде, для которого не хватает функций обратного вызова, устанавливаемых при вызове конструктора QDMapView.
Пример установки и реализации функций можно посмотреть в исходных текстах библиотеки компонентов, файл /usr/share/gisdesigner/examples/Sdk/qmapcomponents/qdmwina.cpp.

 
Понятно, что дело темное.
Я сейчас в конструктор основного окна приложения сделал так:
Код
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    mapSetMapAccessLanguage(ML_RUSSIAN);
    vMap = new uxMapView(this);
    ui->frameMap->addWidget(vMap);
#ifndef WIN32
    //Вот не работает в Астре без этого!!!
    QDMapView *m=new  QDMapView(this);
    delete m;
#endif
}
костыль, конечно, но может быть когда-нибудь руководство приобретет GTK >= 14, тогда и посмотрим.
 
Продолжаем исследования.
Установил на новый компьютер Windows 10, GTK 14 и Qt 5.15 (Qt простым переносом с рабочего ноутбука - санкции, инсталлятор не желает работать с Россией), *.lib - ы все те же из GTK Active
И тут выясняются особенности: при вызове mapViewImageToXImage приложение просто падает с криком Access Violation.
Причем если эту функцию закомментировать, понятно карта не отображается, но и не падает, остальные функции карты работают, выбранный на карте объект (тыканием вслепую) функцией mapPaintExampleObjectByFuncToXImage вполне себе нормально отображается.
Если скомпилированное на новом компьютере приложение и просто перенести на ноутбук, то оно там прекрасно работает.
Если скомпилированное рабочее приложение с ноутбука перенести на новый компьютер  - падает.
Чего-то на новом компьютере не хватает?  
Изменено: Валерий Парусов - 27.05.2022 14:59:37
 
Есть вопросы.

Какая разрядность ОС? Какой разрядности собирается приложение?

Какой компилятор? Вы приложение собираете в VS?
Какой версии?
Какой версии используется Microsoft Visual C++ Redistributable, если используется?
 
В обоих случаях:
Windows 10 x64
компилятор MSVC 2019 x32
Qt 5.15.1
Qt Creator 6.0.1
Visual C++ Redistributable 2015-2022
Изменено: Валерий Парусов - 27.05.2022 16:36:38
Страницы: 1 2 След.
Читают тему (гостей: 1)



© КБ Панорама, 1991-2024

Регистрируясь или авторизуясь на форуме, Вы соглашаетесь с Политикой конфиденциальности