多个范例 (ActiveQt)

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)
    {
    }
    QColor fillColor() const
    {
        return m_fillColor;
    }
    void setFillColor(const QColor &fc)
    {
        m_fillColor = fc;
        repaint();
    }
protected:
    void paintEvent(QPaintEvent *e) override
    {
        QPainter paint(this);
        QRect r = rect();
        r.adjust(10, 10, -10, -10);
        paint.fillRect(r, m_fillColor);
    }
private:
    QColor m_fillColor = Qt::red;
};
					

第 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:
    using QWidget::QWidget;
    int lineWidth() const
    {
        return m_lineWidth;
    }
    void setLineWidth(int lw)
    {
        m_lineWidth = lw;
        repaint();
    }
protected:
    void paintEvent(QPaintEvent *e) override
    {
        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 = 1;
};
					

第 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>
					

范例工程 @ code.qt.io