Пример "Hierarchy" (ActiveQt)
Файлы: Пример "Hierarchy" показывает, как написать внутрипроцессный (in-process) элемент управления ActiveX. Элемент управления является подклассом QWidget с дочерними виджетами, которые доступны как подтипы (sub-types). class QParentWidget : public QWidget { Q_OBJECT Q_CLASSINFO("ClassID", "{d574a747-8016-46db-a07c-b2b4854ee75c}"); Q_CLASSINFO("InterfaceID", "{4a30719d-d9c2-4659-9d16-67378209f822}"); public: QParentWidget(QWidget *parent = 0); QSize sizeHint() const; public slots: void createSubWidget( const QString &name ); QSubWidget *subWidget( const QString &name ); private: QVBoxLayout *vbox; }; Класс QParentWidget предоставляет слоты для создания виджета с именем, и возвращает указатель на именованный (named) виджет. Декларация класса использует Q_CLASSINFO() чтобы предоставить идентификаторы COM для этого класса. QParentWidget::QParentWidget(QWidget *parent) : QWidget(parent) { vbox = new QVBoxLayout(this); } Конструктор QParentWidget создает прямоугольной вертикальной компоновки. Новые дочерние виджеты автоматически добавляются в компоновку. void QParentWidget::createSubWidget(const QString &name) { QSubWidget *sw = new QSubWidget(this, name); vbox->addWidget(sw); sw->setLabel(name); sw->show(); } Слот createSubWidget создает новый QSubWidget с именем, предоставленным в параметре, и устанавливает метку равной этому имени. Виджет показывается также явно. QSubWidget *QParentWidget::subWidget(const QString &name) { return qFindChild<QSubWidget*>(this, name); } Слот subWidget использует функцию QObject::child() и возвращает первого потомка типа QSubWidget, который имеет требуемое имя. class QSubWidget : public QWidget { Q_OBJECT Q_PROPERTY( QString label READ label WRITE setLabel ) Q_CLASSINFO("ClassID", "{850652f4-8f71-4f69-b745-bce241ccdc30}"); Q_CLASSINFO("InterfaceID", "{2d76cc2f-3488-417a-83d6-debff88b3c3f}"); Q_CLASSINFO("ToSuperClass", "QSubWidget"); public: QSubWidget(QWidget *parent = 0, const QString &name = QString()); void setLabel( const QString &text ); QString label() const; QSize sizeHint() const; protected: void paintEvent( QPaintEvent *e ); private: QString lbl; }; Класс QSubWidget имеет одно строковое свойство label и реализует paintEvent чтобы рисовать метку. Класс использует снова Q_CLASSINFO для предоставления идентификаторов COM, и также устанавливает атрибут ToSuperClass равным QSubWidget, чтобы гарантировать, что не открыт ни один слот любого из суперклассов (т.е. QWidget). QSubWidget::QSubWidget(QWidget *parent, const QString &name) : QWidget(parent) { setObjectName(name); } void QSubWidget::setLabel(const QString &text) { lbl = text; setObjectName(text); update(); } QString QSubWidget::label() const { return lbl; } QSize QSubWidget::sizeHint() const { QFontMetrics fm(font()); return QSize(fm.width(lbl), fm.height()); } void QSubWidget::paintEvent(QPaintEvent *) { QPainter painter(this); painter.setPen(palette().text().color()); painter.drawText(rect(), Qt::AlignCenter, lbl); } Реализация класса QSubWidget не требует объяснений. #include "objects.h" #include <QAxFactory> QAXFACTORY_BEGIN("{9e626211-be62-4d18-9483-9419358fbb03}", "{75c276de-1df5-451f-a004-e4fa1a587df1}") QAXCLASS(QParentWidget) QAXTYPE(QSubWidget) QAXFACTORY_END() Затем классы экспортируются используя QAxFactory. QParentWidget экспоритруется как полный (full) класс (который можно создать), тогда как QSubWidget экспортируется только как тип, который может быть создан только косвенно через API QParentWidget. Чтобы собрать пример вы должны сначала собрать библиотеку QAxServer. Затем запустите qmake и ваш make-инструмент в каталоге examples/activeqt/multiple. Демонстрационная программа требует поддержки элементов управления ActiveX в вашем веб-браузере, а также разрешения выполнения сценариев. <script language="javascript"> function createSubWidget( form ) { ParentWidget.createSubWidget( form.nameEdit.value ); } function renameSubWidget( form ) { var SubWidget = ParentWidget.subWidget( form.nameEdit.value ); if ( !SubWidget ) { alert( "No such widget " + form.nameEdit.value + "!" ); return; } SubWidget.label = form.labelEdit.value; form.nameEdit.value = SubWidget.label; } function setFont( form ) { ParentWidget.font = form.fontEdit.value; } </script> <p> This widget can have many children! </p> <object ID="ParentWidget" CLASSID="CLSID:d574a747-8016-46db-a07c-b2b4854ee75c" CODEBASE="http://www.trolltech.com/demos/hierarchy.cab"> [Object not available! Did you forget to build and register the server?] </object><br /> <form> <input type="edit" ID="nameEdit" value="<enter object name>" /> <input type="button" value="Create" onClick="createSubWidget(this.form)" /> <input type="edit" ID="labelEdit" /> <input type="button" value="Rename" onClick="renameSubWidget(this.form)" /> <br /> <input type="edit" ID="fontEdit" value="MS Sans Serif" /> <input type="button" value = "Set Font" onClick="setFont(this.form)" /> </form>
|
Попытка перевода Qt документации. Если есть желание присоединиться, или если есть замечания или пожелания, то заходите на форум: Перевод Qt документации на русский язык... Люди внесшие вклад в перевод: Команда переводчиков |