封装示例(ActiveQt)
该封装示例演示了如何将现有的QWidget 类导出为ActiveX控件,以及如何将QAxFactory 与QAXFACTORY_EXPORT() 宏结合使用。本示例中的ActiveX控件是Qt提供的标准按钮类:QPushButton 、QCheckBox 和QRadioButton 。
class ActiveQtFactory : public QAxFactory
{
public:
ActiveQtFactory(const QUuid &lib, const QUuid &app)
: QAxFactory(lib, app)
{}
QStringList featureList() const override
{
return m_activeElements.keys();
}
QObject *createObject(const QString &key) override
{
auto it = m_activeElements.find(key);
if (it != m_activeElements.end())
return it->create();
return nullptr;
}
const QMetaObject *metaObject(const QString &key) const override
{
auto it = m_activeElements.find(key);
if (it != m_activeElements.end())
return it->metaObject;
return nullptr;
}
QUuid classID(const QString &key) const override
{
auto it = m_activeElements.find(key);
if (it != m_activeElements.end())
return it->classID;
return QUuid();
}
QUuid interfaceID(const QString &key) const override
{
auto it = m_activeElements.find(key);
if (it != m_activeElements.end())
return it->interfaceID;
return QUuid();
}
QUuid eventsID(const QString &key) const override
{
auto it = m_activeElements.find(key);
if (it != m_activeElements.end())
return it->eventsID;
return QUuid();
}
private:
struct ActiveElement {
QUuid classID;
QUuid interfaceID;
QUuid eventsID;
const QMetaObject *metaObject;
std::function<QObject *()> create;
};
const QHash<QString, ActiveElement> m_activeElements {
{
QStringLiteral("QCheckBox"), {
QUuid("{6E795DE9-872D-43CF-A831-496EF9D86C68}"),
QUuid("{4FD39DD7-2DE0-43C1-A8C2-27C51A052810}"),
QUuid("{FDB6FFBE-56A3-4E90-8F4D-198488418B3A}"),
&QCheckBox::staticMetaObject,
[]() { return new QCheckBox; }
}
},
{
QStringLiteral("QRadioButton"), {
QUuid("{AFCF78C8-446C-409A-93B3-BA2959039189}"),
QUuid("{7CC8AE30-206C-48A3-A009-B0A088026C2F}"),
QUuid("{73EE4860-684C-4A66-BF63-9B9EFFA0CBE5}"),
&QRadioButton::staticMetaObject,
[]() { return new QRadioButton; }
}
},
{
QStringLiteral("QPushButton"), {
QUuid("{2B262458-A4B6-468B-B7D4-CF5FEE0A7092}"),
QUuid("{06831CC9-59B6-436A-9578-6D53E5AD03D3}"),
QUuid("{3CC3F17F-EA59-4B58-BBD3-842D467131DD}"),
&QPushButton::staticMetaObject,
[]() { return new QPushButton; }
}
},
{
QStringLiteral("QToolButton"), {
QUuid("{7c0ffe7a-60c3-4666-bde2-5cf2b54390a1}"),
QUuid("{6726080f-d63d-4950-a366-9bf33e5cdf84}"),
QUuid("{f4d421fd-4ead-4fd9-8a25-440766939639}"),
&QToolButton::staticMetaObject,
[]() { return new QToolButton; }
}
},
};
};工厂实现返回支持的控件列表,根据请求创建控件,并提供每个控件对应的 COM 类和接口的唯一 ID 信息。
QAXFACTORY_EXPORT(ActiveQtFactory, "{3B756301-0075-4E40-8BE8-5A81DE2426B7}", "{AB068077-4924-406a-BBAF-42D91C8727DD}")该工厂通过QAXFACTORY_EXPORT 宏进行导出。
要编译该示例,您必须先编译QAxServer 库。然后在examples/activeqt/wrapper 中运行qmake 以及您的 make 工具。
该演示需要一个支持 ActiveX 控件的 Web 浏览器,并且需启用脚本功能。
<SCRIPT LANGUAGE="VBScript">
Sub ToolButton_Clicked()
RadioButton.text = InputBox( "Enter something", "Wrapper Demo" )
End Sub
Sub PushButton_clicked()
MsgBox( "Thank you!" )
End Sub
Sub CheckBox_toggled( state )
if state = 0 then
CheckBox.text = "Check me!"
else
CheckBox.text = "Uncheck me!"
end if
End Sub
</SCRIPT>
<p />
A QPushButton:<br />
<object ID="PushButton" CLASSID="CLSID:2B262458-A4B6-468B-B7D4-CF5FEE0A7092"
CODEBASE="http://qt.nokia.com/demos/wrapperax.cab">
<PARAM NAME="text" VALUE="Click me!" />
[Object not available! Did you forget to build and register the server?]
</object><br />
<p />
A QCheckBox:<br />
<object ID="CheckBox" CLASSID="CLSID:6E795de9-872d-43cf-a831-496ef9d86c68"
CODEBASE="http://qt.nokia.com/demos/wrapperax.cab">
<PARAM NAME="text" VALUE="Check me!" />
[Object not available! Did you forget to build and register the server?]
</object><br />
<p />
A QToolButton:<br />
<object ID="ToolButton" CLASSID="CLSID:7c0ffe7a-60c3-4666-bde2-5cf2b54390a1"
CODEBASE="http://qt.nokia.com/demos/wrapperax.cab">
[Object not available! Did you forget to build and register the server?]
</object><br />
<p />
A QRadioButton:<br />
<object ID="RadioButton" CLASSID="CLSID:afcf78c8-446c-409a-93b3-ba2959039189"
CODEBASE="http://qt.nokia.com/demos/wrapperax.cab">
<PARAM NAME="text" VALUE="Tune me!" />
[Object not available! Did you forget to build and register the server?]
</object><br />© 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.