Чтение онлайн

ЖАНРЫ

QT 4: программирование GUI на С++

Саммерфилд Марк

Шрифт:

В предыдущем примере мы определяли идентификаторы класса и интерфейса при экспорте класса QAxBouncer, используя макрос QAXFACTORY_DEFAULT. В этом примере мы хотим экспортировать несколько классов, поэтому нельзя использовать макрос QAXFACTORY_DEFAULT. Мы можем поступать двумя способами:

• можно создать подкласс QAxFactory, переопределить его виртуальные функции для представления информации об экспортируемых нами типах и использовать макрос QAXFACTORY_EXPORT для регистрации фабрики классов;

• можно использовать макросы QAXFACTORY_BEGIN, QAXFACTORY_END, QAXCLASS и QAXTYPE для

объявления и регистрации фабрики классов. В этом случае потребуется использовать макрос Q_CLASSINFO для определения идентификаторов класса и интерфейса.

Вернемся к определению класса AddressBook. Третий вызов макроса Q_CLASSINFO может показаться немного странным. По умолчанию элементы управления ActiveX предоставляют в распоряжение клиентов не только свои собственные свойства, сигналы и слоты, но и свои суперклассы вплоть до QWidget. Атрибут ToSuperClass позволяет определить суперкласс самого высокого уровня (в дереве наследования), который мы собираемся предоставить клиенту. Здесь мы указываем имя класса компонента («AddressBook») в качестве имени экспортируемого класса самого высокого уровня — это значит, что не будут экспортироваться свойства, сигналы и слоты, определенные в суперклассах AddressBook.

01 class ABItem : public QObject, public QListViewItem

02 {

03 Q_OBJECT

04 Q_PROPERTY(QString contact READ contact WRITE setContact)

05 Q_PROPERTY(QString address READ address WRITE setAddress)

06 Q_PROPERTY(QString phoneNumber

07 READ phoneNumber WRITE setPhoneNumber)

08 Q_CLASSINFO("ClassID",

09 "{bc82730e-5f39-4e5c-96be-461c2cd0d282}")

10 Q_CLASSINFO("InterfaceID",

11 "{c8bc1656-870e-48a9-9937-fbe1ceff8b2e}")

12 Q_CLASSINFO("ToSuperClass", "ABItem")

13 public:

14 ABItem(QTreeWidget *treeWidget);

15 void setContact(const QString &contact);

16 QString contact const { return text(0); }

17 void setAddress(const QString &address);

18 QString address const { return text(1); }

19 void setPhoneNumber(const QString &number);

20 QString phoneNumber const { return text(2); }

21 public slots:

22 void remove;

23 };

Класс ABItem представляет один элемент в адресной книге. Он наследует QTreeWidgetItem и поэтому может отображаться в QTreeWidget, и он также наследует QObject и поэтому может экспортироваться как объект СОМ.

01 int main(int argc, char *argv[])

02 {

03 QApplication app(argc, argv);

04 if (!QAxFactory::isServer) {

05 AddressBook addressBook;

06 addressBook.show;

07 return app.exec;

08 }

09 return app.exec;

10 }

В

функции main мы проверяем, в каком качестве работает приложение: как автономное приложение или как сервер. Опция командной строки —activex распознается объектом QApplication и обеспечивает работу приложения в качестве сервера. Если приложение не является сервером, мы создаем главный виджет и выводим его на экран, как мы обычно делаем для любого автономного приложения Qt.

Кроме опции —activex серверы ActiveX «понимают» следующие опции командной строки:

—regserver — регистрация сервера в системном реестре;

—unregserver — отмена регистрации сервера в системном реестре;

—dumpidl файл — записывает описание сервера на языке IDL (Interface Description Language — язык описания интерфейсов) в указанный файл.

Когда приложение выполняет функции сервера, нам необходимо экспортировать классы AddressBook и ABItem как компоненты СОМ:

QAXFACTORY_BEGIN("{2b2b6f3e-86cf-4c49-9df5-80483b47f17b}",

"{8e827b25-148b-4307-ba7d-23f275244818}")

QAXCLASS(AddressBook)

QAXTYPE(ABItem)

QAXFACTORY_END

Приведенные выше макросы экспортируют фабрику классов для создания объектов СОМ. Поскольку мы собираемся экспортировать два типа объектов СОМ, мы не можем просто использовать макрос QAXFACTORY_DEFAULT, как мы делали в предыдущем примере.

Первым аргументом макроса QAXFACTORY_BEGIN является идентификатор библиотеки типов; второй аргумент представляет собой идентификатор приложения. Между макросами QAXFACTORY_BEGIN и QAXFACTORY_END мы указываем все классы, которые могут быть инстанцированы, и все типы данных, доступные как объекты СОМ.

Ниже приводится файл .pro для внепроцессного сервера ActiveX:

TEMPLATE = app

CONFIG += qaxserver

HEADERS = abitem.h \

addressbook.h \

editdialog.h

SOURCES = abitem.cpp \

addressbook.cpp \

editdialog.cpp \

main.cpp

FORMS = editdialog.ui

RC_FILE = qaxserver.rc

Файл qaxserver.rc, на который имеется ссылка в файле .pro, является стандартным файлом, который может быть скопирован из каталога Qt src\activeqt\control.

Вы можете посмотреть в каталоге примеров vb проект Visual Basic, который использует сервер Address Book.

Этим мы завершаем наш обзор рабочей среды ActiveQt. Дистрибутив Qt включает дополнительные примеры, и в документации содержится информация о способах построения модулей QAxContainer и QAxServer и решения обычных вопросов взаимодействия.

Управление сеансами в системе X11

Поделиться с друзьями: