Russian Qt Forum
Май 16, 2024, 12:21 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Не работает QAxBase::asVariant() [решено]  (Прочитано 5653 раз)
silart
Гость
« : Март 17, 2009, 12:23 »

Добрый день всем!

Возникла странная проблема. Почему-то при вызове QAxBase::asVariant() у объекта QAxWidget возвращает пустой вариант. Причем у QAxObject все работает замечательно. Покапался я немного в коде Qt и обнаружил, что в функции
Код:
QVariant QAxBase::asVariant() const
которая находится в файле qaxbase.cpp присутствует закомментированная строка.
Код:
QVariant QAxBase::asVariant() const
{
    if (!d->ptr && !d->initialized) {
        ((QAxBase*)this)->initialize(&d->ptr);
        d->initialized = true;
    }

    QVariant qvar;
    QByteArray cn(className());
    if (cn == "QAxObject" || cn == "QAxBase") {
        if (d->dispatch())
            qVariantSetValue(qvar, d->dispatch());
        else if (d->ptr)
            qVariantSetValue(qvar, d->ptr);
    } else {
        cn = cn.mid(cn.lastIndexOf(':') + 1);
        QObject *object = qObject();
        if (QMetaType::type(cn))
            qvar = QVariant(qRegisterMetaType<QObject*>(cn + "*"), &object);
//            qVariantSetValue(qvar, qObject(), cn + "*");
    }

    return qvar;
}

Очень странно... Версия Qt 4.4.3. Просто хочу узнать в чем дело (в Qt или в компоненте) и что я делаю не так. На VB компонента работает хорошо.



« Последнее редактирование: Июль 31, 2009, 17:50 от silart » Записан
silart
Гость
« Ответ #1 : Март 18, 2009, 11:56 »

Ну очень странный глюк!
Пришлось искать обходные пути.
Вот как я решил проблему:

Код:
// QAxWidget* ui.pPreview;
IDispatch *pI = NULL;
QUuid id(IID_IDispatch);
ui.pPreview->queryInterface(id, (void**)&pI);
QVariant preview = QVariant(qRegisterMetaType<IDispatch*>("IDispatch*"), &pI);
pI->Release();

Пришлось вручную толкать указатель на COM объект в QVariant.
Совершенно непонятно почему разработчики не дают сделать это штатными методами.
Не ясно, ошибка это, или сделано специально.
Записан
silart
Гость
« Ответ #2 : Март 29, 2009, 17:31 »

Протестировал приведенный код на Qt 4.5.0. Удивительно! Там все работает правильно!
Значит такое странное поведение в предыдущих версиях было ошибкой и они ее исправили, что не может не радовать!  Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.041 секунд. Запросов: 17.