簡単な例(ActiveQt)

簡単な例では、QAxBindableQAxFactory の使い方を説明します。

この単純な例では、QAxBindable::requestPropertyChange ()とQAxBindable::propertyChanged ()、QAXFACTORY_BEGIN()QAXCLASS()QAXFACTORY_END() マクロによるQAxFactory の使用を示します。

この例のActiveXコントロールは、QSliderQLCDNumberQLineEdit を持つレイアウトされたQWidget です。スライダーとライン編集の値を変更し、プロパティの変更を通知するためのシグナル/スロット/プロパティ・インターフェースを提供します。

この例の 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>

2番目の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

© 2025 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.