Пример "OpenGL" (ActiveQt)
Файлы:
Пример "OpenGL" демонстрирует использование фабрики по умолчанию и QAxFactory::isServer(), а также реализацию дополнительного интерфейса COM используя QAxBindable и QAxAggregated. Исполняемый файл сервера можно запустить и как ActiveX-сервер и как автономное приложение. Элемент управления ActiveX в этом примере использует класс QGlWidget в Qt для визуализации сцены OpenGL в ActiveX. Элемент управления делает видимым несколько методов изменения сцены. Приложение использует фабрику по умолчанию как предоставляет макрос QAXFACTORY_DEFAULT чтобы сделать видимым виджет GLBox как элемент управления ActiveX. #include <QAxFactory> QAXFACTORY_DEFAULT( GLBox, "{5fd9c22e-ed45-43fa-ba13-1530bb6b03e0}", "{33b051af-bb25-47cf-a390-5cfd2987d26a}", "{8c996c29-eafa-46ac-a6f9-901951e765b5}", "{2c3c183a-eeda-41a4-896e-3d9c12c3577d}", "{83e16271-6480-45d5-aaf1-3f40b7661ae4}" ) Реализация main инициализирует объект QApplication и использует QAxFactory::isServer() для определения подойдет ли она или нет для создания и показа интерфейса приложения. /*
Основная программа.
*/
int main( int argc, char **argv )
{
QApplication::setColorSpec( QApplication::CustomColor );
QApplication a(argc,argv);
if ( !QGLFormat::hasOpenGL() ) {
qWarning( "This system has no OpenGL support. Exiting." );
return -1;
}
if ( !QAxFactory::isServer() ) {
GLObjectWindow w;
w.resize( 400, 350 );
w.show();
return a.exec();
}
return a.exec();
}
Класс GLBox унаследован и от класса QGLWidget чтобы иметь возможность визуализировать OpenGL, b jn QAxBindable. #include <QAxBindable> class GLBox : public QGLWidget, public QAxBindable { Q_OBJECT Класс переопределяет функцию QAxBindable::createAggregate() из QAxBindable для возврата указателя на объект QAxAggregated. public: GLBox( QWidget* parent, const char* name = 0 ); ~GLBox(); QAxAggregated *createAggregate(); public slots: void setXRotation( int degrees ); Остальная часть объявление класса и реализации визуализации OpenGL является такой же что и в оригинальном примере "box". Файл реализации класса GLBox включает в себя системный заголовочный файл objsafe.h, в котором определён интерфейс COM IObjectSafety. #include <objsafe.h> Класс ObjectSafetyImpl объявлен с использованием множественного наследования для подкласса класса QAxAggregated и для реализации интерфейса IObjectSafety. class ObjectSafetyImpl : public QAxAggregated, public IObjectSafety { public: Класс объявляет конструктор по умолчанию и реализует функцию queryInterface для поддержки интерфейса IObjectSafety. ObjectSafetyImpl() {} long queryInterface( const QUuid &iid, void **iface ) { *iface = 0; if ( iid == IID_IObjectSafety ) *iface = (IObjectSafety*)this; else return E_NOINTERFACE; AddRef(); return S_OK; } Поскольку каждый интерфейс COM унаследован от IUnknown макрос QAXAGG_IUNKNOWN используется для предоставления реализацию по умолчанию интерфейса IUnknown. Макрос определён для делегирования всех вызовов QueryInterface, AddRef и Release для интерфейса, возвращаемого функцией controllingUnknown(). QAXAGG_IUNKNOWN; Реализация интерфейса IObjectSafety предоставляет вызывающему информацию о поддерживаемых и включенных опциях безопасности, а возвращает S_OK для всех вызовов чтобы показать, что элемент управления ActiveX является безопасным. HRESULT WINAPI GetInterfaceSafetyOptions( REFIID riid, DWORD *pdwSupportedOptions, DWORD *pdwEnabledOptions ) { *pdwSupportedOptions = INTERFACESAFE_FOR_UNTRUSTED_DATA | INTERFACESAFE_FOR_UNTRUSTED_CALLER; *pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_DATA | INTERFACESAFE_FOR_UNTRUSTED_CALLER; return S_OK; } HRESULT WINAPI SetInterfaceSafetyOptions( REFIID riid, DWORD pdwSupportedOptions, DWORD pdwEnabledOptions ) { return S_OK; } }; Реализация функции createAggregate() возвращает только новый объект ObjectSafetyImpl. QAxAggregated *GLBox::createAggregate() { return new ObjectSafetyImpl(); } Чтобы собрать пример вы должны сначала собрать библиотеку QAxServer. Затем запустите qmake и ваш make-инструмент в каталоге examples/activeqt/wrapper. Демонстрационная программа требует поддержки элементов управления ActiveX в вашем веб-браузере, а также разрешения выполнения сценариев. В отличие от других примеров QAxServer Internet Explorer не откроет диалоговое окно для запроса у пользователя будет или нет разрешено выполнение сценариев элемента управления GLBox (точное поведение браузера зависит от настроек безопасности в диалоге Internet Options). <SCRIPT LANGUAGE="JavaScript"> function setRot( form ) { GLBox.setXRotation( form.XEdit.value ); GLBox.setYRotation( form.YEdit.value ); GLBox.setZRotation( form.ZEdit.value ); } </SCRIPT> <p /> An OpenGL scene:<br /> <object ID="GLBox" CLASSID="CLSID:5fd9c22e-ed45-43fa-ba13-1530bb6b03e0" CODEBASE="http://www.trolltech.com/demos/openglax.cab"> [Object not available! Did you forget to build and register the server?] </object><br /> <form> Rotate the scene:<br /> X:<input type="edit" ID="XEdit" value="0" /><br /> Y:<input type="edit" name="YEdit" value="0" /><br /> Z:<input type="edit" name="ZEdit" value="0" /><br /> <input type="button" value="Set" onClick="setRot(this.form)" /> </form>
|
Попытка перевода Qt документации. Если есть желание присоединиться, или если есть замечания или пожелания, то заходите на форум: Перевод Qt документации на русский язык... Люди внесшие вклад в перевод: Команда переводчиков |