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

на главную - закладки

Жанры

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

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

Шрифт:

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

TEMPLATE = lib

CONFIG += dll qaxserver

HEADERS = axbouncer.h \

objectsafetyimpl.h

SOURCES = axbouncer.cpp \

main.cpp \

objectsafetyimpl.cpp

RC_FILE = qaxserver.rc

DEF_FILE = qaxserver.def

Файлы qaxserver.rc и qaxserver.def, на

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

Файл makefile или сгенерированный утилитой qmake файл проекта Visual С++ содержат правила для регистрации сервера в реестре Windows. Для регистрации сервера на машине пользователя мы можем использовать утилиту regsvr32, которая имеется во всех системах Windows.

Мы можем затем включить компонент Bouncer в страницу HTML, используя тег <object>:

<object id="AxBouncer"

classid="clsid:5e2461aa-a3e8-4f7a-8b04-307459a4c08c">

<b>The ActiveX control is not available. Make sure you

have built and registered the component server.</b>

</object>

Мы можем создать кнопку для вызова слотов:

<input type="button" value="Start" onClick="AxBouncer.start">

<input type="button" value="Stop" onClick="AxBouncer.stop">

Мы можем манипулировать виджетом при помощи языков JavaScript или VBScript точно так же, как и любым другим элементом управления ActiveX (см. расположенный на компакт-диске файл demo.html, содержащий очень простую страницу, в которой используется сервер ActiveX.

Наш последний пример — приложение Address Book (адресная книга), применяющее сценарий. Это приложение может рассматриваться в качестве стандартного приложения Qt для Windows или внепроцессного сервера ActiveX. В последнем случае мы можем создавать сценарий работы приложения, используя, например, Visual Basic.

01 class AddressBook : public QMainWindow

02 {

03 Q_OBJECT

04 Q_PROPERTY(int count READ count)

05 Q_CLASSINFO("ClassID",

06 "{588141ef-110d-4beb-95ab-ee6a478b576d}")

07 Q_CLASSINFO("InterfaceID",

08 "{718780ec-b30c-4d88-83b3-79b3d9e78502}")

09 Q_CLASSINFO("ToSuperClass", "AddressBook")

10 public:

11 AddressBook(QWidget *parent = 0);

12 ~AddressBook;

13 int count const;

14 public slots:

15 ABItem *createEntry(const QString &contact);

16 ABItem *findEntry(const QString &contact) const;

17 ABItem *entryAt(int index) const;

18 private slots:

19 void addEntry;

20 void editEntry;

21 void deleteEntry;

22 private:

23 void createActions;

24 void createMenus;

25 QTreeWidget *treeWidget;

26 QMenu *fileMenu;

27 QMenu *editMenu;

28 QAction *exitAction;

29 QAction *addEntryAction;

30 QAction *editEntryAction;

31 QAction *deleteEntryAction;

32 };

Виджет AddressBook является

главным окном приложения. Предоставляемые им свойства и слоты можно применять при создании сценария. Макрос Q_CLASSINFO используется для определения идентификаторов класса и интерфейсов, связанных с классом. Они генерируются с помощью таких утилит, как guid или uuid.

В предыдущем примере мы определяли идентификаторы класса и интерфейса при экспорте класса 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}")

Поделиться:
Популярные книги

Моя на одну ночь

Тоцка Тала
Любовные романы:
современные любовные романы
короткие любовные романы
5.50
рейтинг книги
Моя на одну ночь

Черный Маг Императора 8

Герда Александр
8. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Черный Маг Императора 8

Измена. Отбор для предателя

Лаврова Алиса
1. Отбор для предателя
Фантастика:
фэнтези
5.00
рейтинг книги
Измена. Отбор для предателя

Кодекс Крови. Книга II

Борзых М.
2. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга II

Шаг в бездну

Муравьёв Константин Николаевич
3. Перешагнуть пропасть
Фантастика:
фэнтези
космическая фантастика
7.89
рейтинг книги
Шаг в бездну

Часовая битва

Щерба Наталья Васильевна
6. Часодеи
Детские:
детская фантастика
9.38
рейтинг книги
Часовая битва

Вечная Война. Книга II

Винокуров Юрий
2. Вечная война.
Фантастика:
юмористическая фантастика
космическая фантастика
8.37
рейтинг книги
Вечная Война. Книга II

Хроники странного королевства. Вторжение. (Дилогия)

Панкеева Оксана Петровна
110. В одном томе
Фантастика:
фэнтези
9.38
рейтинг книги
Хроники странного королевства. Вторжение. (Дилогия)

Часовой ключ

Щерба Наталья Васильевна
1. Часодеи
Фантастика:
фэнтези
9.36
рейтинг книги
Часовой ключ

Инвестиго, из медика в маги

Рэд Илья
1. Инвестиго
Фантастика:
фэнтези
городское фэнтези
попаданцы
5.00
рейтинг книги
Инвестиго, из медика в маги

Кротовский, может, хватит?

Парсиев Дмитрий
3. РОС: Изнанка Империи
Фантастика:
попаданцы
альтернативная история
аниме
7.50
рейтинг книги
Кротовский, может, хватит?

Драконий подарок

Суббота Светлана
1. Королевская академия Драко
Любовные романы:
любовно-фантастические романы
7.30
рейтинг книги
Драконий подарок

Очешуеть! Я - жена дракона?!

Амеличева Елена
Фантастика:
юмористическая фантастика
5.43
рейтинг книги
Очешуеть! Я - жена дракона?!

Идеальный мир для Лекаря 9

Сапфир Олег
9. Лекарь
Фантастика:
боевая фантастика
юмористическое фэнтези
6.00
рейтинг книги
Идеальный мир для Лекаря 9