翻譯|使用教程|編輯:鮑佳佳|2021-04-07 11:15:16.837|閱讀 188 次
概述:層次結構示例顯示了如何編寫進程內ActiveX控件。該控件是一個QWidget子類,帶有子小部件,這些子小部件可以作為子類型進行訪問。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
層次結構示例顯示了如何編寫進程內ActiveX控件。該控件是一個QWidget子類,帶有子小部件,這些子小部件可以作為子類型進行訪問。
開始前先介紹一下我們的Qt商業控件:
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立刻體驗吧!!
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自: