简单示例(ActiveQt)
简单示例演示了QAxBindable 和QAxFactory 的使用。
该简单示例演示了QAxBindable::requestPropertyChange() 和QAxBindable::propertyChanged() 的使用,以及QAxFactory 通过QAXFACTORY_BEGIN()
,QAXCLASS()
和QAXFACTORY_END()
宏的使用。
该示例中的 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 工具。
演示要求你的 Web 浏览器支持 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 脚本和 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>
© 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.