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

Использование OnMapMouseMove в Qt 4.8.6 и MS Visual Studio 2010 C++

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: 1
RSS
Использование OnMapMouseMove в Qt 4.8.6 и MS Visual Studio 2010 C++
 
Добрый вечер.
Код
QAxWidget* qAxWidget = new QAxWidget("axGisToolKit.axcMapScreen");
axGisToolKit::IaxMapScreen* iAxMapScreen = NULL;
qAxObject->queryInterface(QUuid("83601656-46E5-45A9-9450-C7B219D92442}"), (void**)&iAxMapScreen);
iAxMapScreen->MapOpenEx("Russia.sitx", true, GENERIC_READ);
qAxWidget->show();

Окно появляется, карта отображается.
Подскажите, не могу понять, как написать реакцию на событие OnMapMouseMove происходящее в IaxMapScreen?

 
Уточню, для чего мне нужно обработка события OnMapMouseMove:
В данном обработчике я планирую просто отображать текущие координаты карты (например, в строке состояния данного окна) на которые указывать указатель мыши.
Для решения данной задачи можно, конечно, изменить код на следующий (меняем QAxWidget на QAxWidget_1):
Код
QAxWidget_1* qAxWidget = new QAxWidget_1("axGisToolKit.axcMapScreen");axGisToolKit::IaxMapScreen* iAxMapScreen = NULL;
qAxObject->queryInterface(QUuid("83601656-46E5-45A9-9450-C7B219D92442}"), (void**)&iAxMapScreen);
iAxMapScreen->MapOpenEx("Russia.sitx", true, GENERIC_READ);
qAxWidget->show();

Создаем класс QAxWidget_1:

Код
class QAxWidget_1: public QAxWidget
...
protected:
    void mouseMoveEvent(QMouseEvent*);
...

Реализация метода void QAxWidget_1::mouseMoveEvent(QMouseEvent* event):
Код
void QAxWidget_1::mouseMoveEvent(QMouseEvent* event)
{
...
    double mapPointX = iAxMapScreen->GetMapLeft() + event->pos().x();
    double mapPointY = iAxMapScreen->GetMapTop()  + event->pos().y();

    // Преобразование координат
    iAxMapPoint->SetPoint(mapPointX,  mapPointY);
    iAxMapPoint->GetPoint(&mapPointX, &mapPointY);

    // Вывод координат с строку состояния
    mapStatusBar->setMapX(QString::number(mapPointX));
    mapStatusBar->setMapY(QString::number(mapPointY));
...
}
Но зачем придумывать такие обходные пути, когда в документации заявлено событие OnMapMouseMove в которое уже поступают координаты указателя мыши в текущей системе координат карты. Вот и есть желание использовать для задачи вывода текущих координат мыши в строку состояние событие OnMapMouseMove.
 
Потому что вы используете событие элемента управления, которое в параметрах имеет тип QMouseEvent* event, а в событии OnMapMouseMove совсем другие параметры.
 
Да - это понятно. А как задействовать событие OnMapMouseMove?
 
Для Visual Studio в инсталляции есть примеры. Как подключить событие из ActiveX для QT необходимо посмотреть в документации по QT
 
Цитата
Как подключить событие из ActiveX для QT необходимо посмотреть в документации по QT
Как раз вот с этим и разбираюсь. Пока не понятно как это сделать в Qt. Суть вопроса в этом и была.
 
Здесь вопрос больше не о том, как использовать наши компоненты, а как получить доступ к событиям ActiveX-компонента, размещенного в QAxWidget (любого, не обязательно из состава GIS ToolKit Active).

К сожалению, специалистов, владеющих нюансами использования Qt в Windows и применения QAxWidget, у нас нет. Поэтому посоветовать ничего не можем, кроме как обратиться к документации по QAxWidget.

Наши компоненты GIS ToolKit Active являются обычными ActiveX-контролами. В зависимости от среды разработки в любом случае будут нюансы их использования, обусловленные самой средой разработки и применяемого стека технологий (в данном случае Qt).
В некоторых случаях, как например в Visual Studio, сама оболочка позволяет получить доступ как к свойствам компонентов, так и к их событиям. Причем в Visual Studio прямо в DesignTime можно кликнув в инспекторе объектов по событию автоматически сгенерировать код обработчика этого события, который программисту остается только наполнить "смыслом".

Как видно из Вашего кода, у Вас встраивание ActiveX-компонента в QAxWidget выполняется в RunTime.
Чтобы связать обработчик и событие в RunTime необходимо иметь этот обработчик.

Событие - это по сути вызов функции обратного вызова. Связывание обработчика и события - это установка адреса функции обратного вызова.
Поэтому сначала надо сделать то, что будет являться этой самой функцией (обработчиком). А затем указать его событию.
Условие: функция должна полностью совпадать по типу с событием (иметь точно такие же параметры входа и выхода).

Как это сделать в QAxWidget не подскажу, но вот примерно как RunTime-связывание будет выглядеть в VS C#:

 
Цитата
kalakom написал:
Да - это понятно. А как задействовать событие OnMapMouseMove?
Смотрим код, который генерирует событие

Цитата
procedure TaxcMapView.MouseMoveProcessEvent(Sender: TObject; Shift: TShiftState;   X, Y: Integer);
begin
 if FEvents <> nil then // 1-е УСЛОВИЕ  ЕСЛИ ОБРАБОЧИК (СЛОТ) ПОДКЛЮЧЕН К КОМПОНЕНТУ MapView
 begin
   FEvents.OnMouseMove(ShiftToInt(Shift), X,Y); // если выполняется первое условие - срабатывает MouseEvent (без MAP)
   if FDelphiControl.MapHandle<>0 then // 2-е УСЛОВИЕ - ЕСЛИ ОТКРЫТА КАРТА
   begin
     FPnt := ConvertMapCoordinates(X,Y,FDelphiControl); // выполняется конвертирование координаты
     FEvents.OnMapMouseMove(ShiftToInt(Shift),FPnt.X, FPnt.Y, FPnt.Z); // и вызов обработчика в котором передаётся INT DOUBLE DOUBLE DOUBLE
   end;
 end;
end;
ВЫВОД:
Должен быть создан и подключен обработчик и обязательно открыта карта
При закрытой карте срабатывает обычный Event. при открытой - и обычный и тот, который вы хотите задействовать )))
Не тот глуп кто не знает, а тот, кто не знает где искать.
 
Спасибо всем за ответы.

Кто пользуется Qt для разработки приложения с использование Gis ToolKit Active подход может быть такой:
В QAxWidget (также как и в QAxObject, а точнее в QAxBase, который является базовым классом для них) есть метод QString generateDocumentation(). После того, как объект будет создан, т.е.:
Код
QAxWidget* qAxWidget = new QAxWidget("axGisToolKit.axcMapScreen");
Вызываем у него метод generateDocumentation() и смотрим в вернувшейся строке (а это будет формат html) документацию на все возможности созданного объекта.
В документации будет сказано, что метод OnMapMouseMove является "сигналом", значить воспользоватся им можно создав "connect" к своему созданному "слоту". Таким образом мы сделаем обработчик OnMapMouseMove.
Также замечу, что наследники от QAxBase не могут иметь макрос Q_OBJECT, а значит не могут иметь "connect". Это решается просто - создается свой класс от QObject с макросом Q_OBJECT, в этот класс агрегируется созданный объект qAxWidget в виде указателя и "connect" уже делается между "сигналом" объекта qAxWidget со "слотом", объявленным в этом классе.
Страницы: 1
Читают тему (гостей: 1)



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

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