Qt层次结构示例:如何编写进程内ActiveX控件

层次结构示例显示了如何编写进程内ActiveX控件。该控件是一个QWidget子类,带有子小部件,这些子小部件可以作为子类型进行访问。

层次结构示例显示了如何编写进程内ActiveX控件。该控件是一个QWidget子类,带有子小部件,这些子小部件可以作为子类型进行访问。

Qt层次结构示例:如何编写进程内ActiveX控件

开始前先介绍一下我们的Qt商业控件:

  • QtitanRibbon| 下载试用: 遵循Microsoft Ribbon UI Paradigm for Qt技术的Ribbon UI组件,致力于为Windows、Linux和Mac OS X提供功能完整的Ribbon组件。
  • QtitanChart | 下载试用 :是一个C ++库,代表一组控件,这些控件使您可以快速地为应用程序提供漂亮而丰富的图表。并且支持所有主要的桌面。
  • QtitanNavigation | 下载试用 :模拟Microsoft Dynamics CRM-2016/Office 365导航界面和一组控件改善Qt.C ++应用程序用户体验的QtitanNavigation组件。
class QParentWidget : public QWidget{    Q_OBJECT    Q_CLASSINFO("ClassID", "{d574a747-8016-46db-a07c-b2b4854ee75c}");    Q_CLASSINFO("InterfaceID", "{4a30719d-d9c2-4659-9d16-67378209f822}");    Q_CLASSINFO("EventsID", "{4a30719d-d9c2-4659-9d16-67378209f823}");public:    explicit QParentWidget(QWidget *parent = nullptr);    QSize sizeHint() const override;public slots:    void createSubWidget(const QString &name);    QSubWidget *subWidget(const QString &name);private:    QVBoxLayout *m_vbox;};

QParentWidget 类提供了创建一个带有名称的小组件和返回一个命名小组件的指针的槽。类的声明使用Q_CLASSINFO()来提供这个类的COM标识符。

QParentWidget::QParentWidget(QWidget *parent): QWidget(parent),  m_vbox(new QVBoxLayout(this)){}

构造函数QParentWidget创建垂直框布局。新的子窗口小部件将自动添加到布局中。

void QParentWidget::createSubWidget(const QString &name){    QSubWidget *sw = new QSubWidget(this, name);    m_vbox->addWidget(sw);    sw->setLabel(name);    sw->show();}

createSubWidget插槽以参数中提供的名称创建一个新的QSubWidget,并将标签设置为该名称。该小组件也被显式显示。

QSubWidget *QParentWidget::subWidget(const QString &name){    return findChild<QSubWidget *>(name);}

子Widget槽使用QObject::findChild()函数,并返回具有请求名称的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 = nullptr, const QString &name = QString());    void setLabel(const QString &text);    QString label() const;    QSize sizeHint() const override;protected:    void paintEvent(QPaintEvent *e) override;private:    QString m_label;};

QSubWidget类有一个单一的字符串属性标签,并实现paintEvent来绘制标签。该类再次使用Q_CLASSINFO来提供COM标识符,并将ToSuperClass属性设置为QSubWidget,以确保只有任何超级类(即QWidget)的插槽不被暴露。

QSubWidget::QSubWidget(QWidget *parent, const QString &name): QWidget(parent){    setObjectName(name);}void QSubWidget::setLabel(const QString &text){    m_label = text;    setObjectName(text);    update();}QString QSubWidget::label() const{    return m_label;}QSize QSubWidget::sizeHint() const{    QFontMetrics fm(font());    return QSize(fm.horizontalAdvance(m_label), fm.height());}void QSubWidget::paintEvent(QPaintEvent *){    QPainter painter(this);    painter.setPen(palette().text().color());    painter.drawText(rect(), Qt::AlignCenter, m_label);}

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被导出为一个完整的类(可以被创建),而QSubWidget只被导出为一个类型,只能通过QParentWidget的API间接创建。

要建立这个例子,你必须首先建立QAxServer库。然后在activeqt/hierarchy中运行qmake和你的make工具。

该演示需要您的WebBrowser支持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.qt-project.org/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立刻体验吧!!

标签:

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2021年3月4日
下一篇 2021年3月4日

相关推荐

发表回复

登录后才能评论