简单示例(ActiveQt)

“简单示例”演示了如何使用QAxBindable 和QAxFactory 。

该简单示例演示了如何使用QAxBindable::requestPropertyChange() 和QAxBindable::propertyChanged(),以及如何通过QAXFACTORY_BEGIN() 、QAXCLASS() 和QAXFACTORY_END() 宏使用QAxFactory 。

本示例中的 ActiveX 控件是一个布局为QWidget 的控件,包含一个QSlider 、一个QLCDNumber 和一个QLineEdit 。它提供了一个信号/插槽/属性接口,用于更改滑块和线性编辑框的值,并接收任何属性变化的通知。

本示例中 ActiveX 的 Qt 实现为

class QSimpleAX : public QWidget, public QAxBindable
{
    Q_OBJECT
    Q_CLASSINFO("ClassID",     "{DF16845C-92CD-4AAB-A982-EB9840E74669}")
    Q_CLASSINFO("InterfaceID", "{616F620B-91C5-4410-A74E-6B81C76FFFE0}")
    Q_CLASSINFO("EventsID",    "{E1816BBA-BF5D-4A31-9855-D6BA432055FF}")
    Q_PROPERTY(QString text READ text WRITE setText)
    Q_PROPERTY(int value READ value WRITE setValue)
public:
    explicit QSimpleAX(QWidget *parent = nullptr)
    : QWidget(parent)
    {
        QVBoxLayout *vbox = new QVBoxLayout(this);

        m_slider = new QSlider(Qt::Horizontal, this);
        m_LCD = new QLCDNumber(3, this);
        m_edit = new QLineEdit(this);

        connect(m_slider, &QAbstractSlider::valueChanged, this, &QSimpleAX::setValue);
        connect(m_edit, &QLineEdit::textChanged, this, &QSimpleAX::setText);

        vbox->addWidget(m_slider);
        vbox->addWidget(m_LCD);
        vbox->addWidget(m_edit);
    }

    QString text() const
    {
        return m_edit->text();
    }

    int value() const
    {
        return m_slider->value();
    }

signals:
    void someSignal();
    void valueChanged(int);
    void textChanged(const QString&);

public slots:
    void setText(const QString &string)
    {
        if (!requestPropertyChange("text"))
            return;

        QSignalBlocker blocker(m_edit);
        m_edit->setText(string);
        emit someSignal();
        emit textChanged(string);

        propertyChanged("text");
    }

    void about()
    {
        QMessageBox::information( this, "About QSimpleAX", "This is a Qt widget, and this slot has been\n"
                                                          "called through ActiveX/OLE automation!" );
    }

    void setValue(int i)
    {
        if (!requestPropertyChange("value"))
            return;

        QSignalBlocker blocker(m_slider);
        m_slider->setValue(i);
        m_LCD->display(i);
        emit valueChanged(i);

        propertyChanged("value");
    }

private:
    QSlider *m_slider;
    QLCDNumber *m_LCD;
    QLineEdit *m_edit;
};

该控件使用默认方式导出QAxFactory

QAXFACTORY_BEGIN(
    "{EC08F8FC-2754-47AB-8EFE-56A54057F34E}", // type library ID
    "{A095BA0C-224F-4933-A458-2DD7F6B85D8F}") // application ID
    QAXCLASS(QSimpleAX)
QAXFACTORY_END()

要构建该示例,必须先构建QAxServer 库。然后在examples/activeqt/simple 目录下运行qmake和您的make工具。

该演示要求您的 WebBrowser 支持 ActiveX 控件,并且已启用脚本功能。

该简单的 ActiveX 控件通过<object> 标签进行嵌入。

<object ID="QSimpleAX" CLASSID="CLSID:DF16845C-92CD-4AAB-A982-EB9840E74669"
CODEBASE="http://qt.nokia.com/demos/simpleax.cab">
    <PARAM NAME="text" VALUE="A simple control" />
    <PARAM NAME="value" VALUE="1" />
[Object not available! Did you forget to build and register the server?]
</object>

一个简单的 HTML 按钮连接到了 ActiveQt 的 about() 槽上。

<FORM>
    <INPUT TYPE="BUTTON" VALUE="About..." onClick="QSimpleAX.about()" />
</FORM>

第二个 ActiveX 控件——标准日历控件——被实例化

<object ID="Calendar" CLASSID="CLSID:8E27C92B-1264-101C-8A2F-040224009C02">
[Standard Calendar control not available!]
    <PARAM NAME="day" VALUE="1" />
</object>

ActiveX 控件的事件使用 Visual Basic Script 和 JavaScript 共同处理。

<SCRIPT LANGUAGE="VBScript">
Sub Calendar_Click()
    MsgBox( "Calendar Clicked!" )
End Sub

Sub QSimpleAX_TextChanged( str )
    document.title = str
End Sub
</SCRIPT>

<SCRIPT LANGUAGE="JavaScript">
function QSimpleAX::ValueChanged( Newvalue )
{
    Calendar.Day = Newvalue;
}
</SCRIPT>

示例项目 @ code.qt.io

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.