The Multiple example demonstrates the implementation of a
QAxFactory
to provide multiple ActiveX controls in a single in process ActiveX server using the
QAXFACTORY_EXPORT()
macro. The ActiveX controls in this example are simple
QWidget
subclasses that reimplement
QWidget::paintEvent
().
class QAxWidget1 : public QWidget { Q_OBJECT Q_CLASSINFO("ClassID", "{1D9928BD-4453-4bdd-903D-E525ED17FDE5}") Q_CLASSINFO("InterfaceID", "{99F6860E-2C5A-42ec-87F2-43396F4BE389}") Q_CLASSINFO("EventsID", "{0A3E9F27-E4F1-45bb-9E47-63099BCCD0E3}") Q_PROPERTY(QColor fillColor READ fillColor WRITE setFillColor) public: explicit QAxWidget1(QWidget *parent = nullptr) : QWidget(parent), m_fillColor(Qt::red) { } QColor fillColor() const { return m_fillColor; } void setFillColor(const QColor &fc) { m_fillColor = fc; repaint(); } protected: void paintEvent(QPaintEvent *e) { QPainter paint(this); QRect r = rect(); r.adjust(10, 10, -10, -10); paint.fillRect(r, m_fillColor); } private: QColor m_fillColor; };
第 1 控件繪製填充矩形。按特性暴露填充顔色。
Q_CLASSINFO()
用於指定 COM 標識符。
class QAxWidget2 : public QWidget { Q_OBJECT Q_CLASSINFO("ClassID", "{58139D56-6BE9-4b17-937D-1B1EDEDD5B71}") Q_CLASSINFO("InterfaceID", "{B66280AB-08CC-4dcc-924F-58E6D7975B7D}") Q_CLASSINFO("EventsID", "{D72BACBA-03C4-4480-B4BB-DE4FE3AA14A0}") Q_CLASSINFO("ToSuperClass", "QAxWidget2") Q_CLASSINFO("StockEvents", "yes") Q_CLASSINFO("Insertable", "yes") Q_PROPERTY(int lineWidth READ lineWidth WRITE setLineWidth) public: explicit QAxWidget2(QWidget *parent = nullptr) : QWidget(parent), m_lineWidth(1) { } int lineWidth() const { return m_lineWidth; } void setLineWidth(int lw) { m_lineWidth = lw; repaint(); } protected: void paintEvent(QPaintEvent *e) { QPainter paint(this); QPen pen = paint.pen(); pen.setWidth(m_lineWidth); paint.setPen(pen); QRect r = rect(); r.adjust(10, 10, -10, -10); paint.drawEllipse(r); } private: int m_lineWidth; };
第 2 控件繪製圓形。按特性暴露綫寬。
Q_CLASSINFO()
用於指定 COM 標識符,和設置屬性
ToSuperClass
and
StockEvents
僅暴露類本身的 API,並將 COM 庫存事件添加到 ActiveX 控件。
#include "ax1.h" #include "ax2.h" #include <QAxFactory> QT_USE_NAMESPACE QAXFACTORY_BEGIN("{98DE28B6-6CD3-4e08-B9FA-3D1DB43F1D2F}", "{05828915-AD1C-47ab-AB96-D6AD1E25F0E2}") QAXCLASS(QAxWidget1) QAXCLASS(QAxWidget2) QAXFACTORY_END()
類的導齣是從服務器使用 QAxFactory 宏。
要構建範例必須先構建
QAxServer
庫。然後運行
qmake
和 make 工具在
examples/activeqt/multiple
.
The 2 簡單 Qt 小部件 演示要求 WebBrowser 支持 ActiveX 控件,並啓用腳本。
<script language="javascript"> function setColor( form ) { Ax1.fillColor = form.colorEdit.value; } function setWidth( form ) { Ax2.lineWidth = form.widthEdit.value; } </script> <p /> This is one QWidget subclass:<br /> <object ID="Ax1" CLASSID="CLSID:1D9928BD-4453-4bdd-903D-E525ED17FDE5" CODEBASE="http://qt.nokia.com/demos/multipleax.cab"> [Object not available! Did you forget to build and register the server?] </object><br /> <form> Fill Color: <input type="edit" ID="colorEdit" value = "red" /> <input type="button" value = "Set" onClick="setColor(this.form)" /> <input type="button" value = "Hide" onClick="Ax1.hide()" /> <input type="button" value = "Show" onClick="Ax1.show()" /> </form> <p /> This is another QWidget subclass:<br /> <object ID="Ax2" CLASSID="CLSID:58139D56-6BE9-4b17-937D-1B1EDEDD5B71" CODEBASE="http://qt.nokia.com/demos/multipleax.cab"> [Object not available! Did you forget to build and register the server?] </object><br /> <form> Line width: <input type="edit" ID="widthEdit" value = "1" /> <input type="button" value = "Set" onClick="setWidth(this.form)" /> </form>
文件: