![]() |
Главная · Все классы · Основные классы · Классы по группам · Модули · Функции | ![]() |
Пример "COM App" показывает, как использовать ActiveQt для разработки приложений Qt, которые могут быть автоматизированы посредством COM. Разные классы, основанные на QObject, показаны как COM-объекты, которые соединены с ГПИ запущенного приложения Qt. API этих COM-объектов спроектированы так, чтобы быть похожими на API стандартных приложений COM; т.е., таковые из Microsoft Office.
Первый класс Application представляет объект приложения. Он делает видимыми свойства только для чтения documents и id для получения доступа к списку документов и идентификатору. Свойство visible, которое можно читать и записывать, управляет будет ли видим пользовательский интерфейс приложения, основанный на QTabWidget, а слот quit() завершает приложение.
Атрибут RegisterObject устанавливается для того, чтобы убедиться, что экземпляры объектов этого класса зарегистрированы в таблице запущенных объектов COM (running object table, ROT) - это позволяет клиентам COM соединяться с уже получившим значение COM-объектом.
Класс DocumentList хранит список документов. Он предоставляет API для чтения количества документов, для получения доступа к каждому документу по индексу и создания нового документа. Свойство application возвращает корневой объект.
Класс Document в конечном счете представляет документ в приложении. Каждый документ представляется страницей в приложении в виджете со вкладками, и имеет заголовок, который можно читать и писать с помощью API документа. Кроме того, свойство application возвращает корневой (root) объект.
Реализация класса Document создает новую страницу для виджета со вкладками, и использует заголовок этой страницы для свойства заголовка. Страница удаляется когда удаляется документ.
Реализация DocumentList очень проста.
Класс Application инициализирует пользовательский интерфейс в конструкторе и показывает и скрывает его в реализации setVisible(). The object name (accessible through the id property) is set to "From QAxFactory" to indicate that this COM object has been created by COM. Note that there is no destructor that would delete the QTabWidget - this is instead done in the quit() slot, before calling QApplication::quit() through a single-shot-timer, which is necessary ensure that the COM call to the slot is complete.
The classes are exported from the server using the QAxFactory macros. Only Application objects can be instantiated from outside - the other APIs can only be used after accessing the respective objects throught the Application API.
Точка входа функции main() создает QApplication, и только входит в цикл обработки событий, если приложение было запущено COM. Если приложение было запущено пользователем, тогда объект Application создан и имя объекта установлено равным "From Application". Затем запускается COM-сервер и объект приложения регистрируется с помощью COM. Теперь он доступен для клиентов COM через клиенто-специфичные API.
Завершение работы приложения контролируется явно - если COM запускает приложение, тогда клиентский код вызывает quit(); если пользователь запускает приложение, тогда приложение завершается когда будет закрыто последнее окно.
В заключение, делается видимым пользовательский интерфейс и запускается цикл обработки событий.
Простое приложение на Visual Basic может теперь получить доступ к данному приложению Qt. Начните в VB новый проект "Standard Exe" и добавьте ссылку проекта на библиотеку типов comappLib. Создайте форму с окном списка (listbox) "DocumentList", статической меткой "DocumentsCount" и кнопку "NewDocument". В заключение, реализуйте код формы примерно так:
Private Application As comappLib.Application Private MyApp As Boolean Private Sub UpdateList() DocumentList.Clear DocumentsCount.Caption = Application.documents.Count For Index = 0 To Application.documents.Count - 1 DocumentList.AddItem (Application.documents.Item(Index).Title) Следующая (Next) End Sub Private Sub Form_Load() On Error GoTo CreateNew Set Application = GetObject(, "comapp.Application") MyApp = False GoTo Initialized CreateNew: On Error GoTo InitializeFailed Set Application = New Application Application.Visible = True MyApp = True Initialized: Caption = Application.id UpdateList InitializeFailed: End Sub Private Sub Form_Unload(Cancel As Integer) If MyApp Then Application.quit End If End Sub Private Sub NewDocument_Click() Application.documents.addDocument UpdateList End Sub
Чтобы собрать пример вы должны сначала собрать библиотеку QAxServer. Затем запустите qmake и ваш make-инструмент в каталогеexamples\activeqt\comapp.
Copyright © 2008 Trolltech | Торговые марки | Qt 4.3.5 |