翻譯|使用教程|編輯:鮑佳佳|2021-04-07 11:15:16.837|閱讀 201 次
概述:層次結(jié)構(gòu)示例顯示了如何編寫(xiě)進(jìn)程內(nèi)ActiveX控件。該控件是一個(gè)QWidget子類(lèi),帶有子小部件,這些子小部件可以作為子類(lèi)型進(jìn)行訪問(wèn)。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門(mén)軟控件火熱銷(xiāo)售中 >>
層次結(jié)構(gòu)示例顯示了如何編寫(xiě)進(jìn)程內(nèi)ActiveX控件。該控件是一個(gè)QWidget子類(lèi),帶有子小部件,這些子小部件可以作為子類(lèi)型進(jìn)行訪問(wèn)。
開(kāi)始前先介紹一下我們的Qt商業(yè)控件:
class QParentWidget : public QWidget
{
Q_OBJECT
Q_CLASSINFO("ClassID", "{d574a747-8016-46db-a07c-b2b4854ee75c}");
Q_CLASSINFO("InterfaceID", "{4a30719d-d9c2-4659-9d16-67378209f822}");
Q_CLASSINFO("EventsID", "{4a30719d-d9c2-4659-9d16-67378209f823}");
public:
explicit QParentWidget(QWidget *parent = nullptr);
QSize sizeHint() const override;
public slots:
void createSubWidget(const QString &name);
QSubWidget *subWidget(const QString &name);
private:
QVBoxLayout *m_vbox;
};
QParentWidget 類(lèi)提供了創(chuàng)建一個(gè)帶有名稱(chēng)的小組件和返回一個(gè)命名小組件的指針的槽。類(lèi)的聲明使用Q_CLASSINFO()來(lái)提供這個(gè)類(lèi)的COM標(biāo)識(shí)符。
QParentWidget::QParentWidget(QWidget *parent)
: QWidget(parent),
m_vbox(new QVBoxLayout(this))
{
}
構(gòu)造函數(shù)QParentWidget創(chuàng)建垂直框布局。新的子窗口小部件將自動(dòng)添加到布局中。
void QParentWidget::createSubWidget(const QString &name)
{
QSubWidget *sw = new QSubWidget(this, name);
m_vbox->addWidget(sw);
sw->setLabel(name);
sw->show();
}
createSubWidget插槽以參數(shù)中提供的名稱(chēng)創(chuàng)建一個(gè)新的QSubWidget,并將標(biāo)簽設(shè)置為該名稱(chēng)。該小組件也被顯式顯示。
QSubWidget *QParentWidget::subWidget(const QString &name)
{
return findChild<QSubWidget *>(name);
}
子Widget槽使用QObject::findChild()函數(shù),并返回具有請(qǐng)求名稱(chēng)的QSubWidget類(lèi)型的第一個(gè)子系列。
class QSubWidget : public QWidget
{
Q_OBJECT
Q_PROPERTY(QString label READ label WRITE setLabel)
Q_CLASSINFO("ClassID", "{850652f4-8f71-4f69-b745-bce241ccdc30}");
Q_CLASSINFO("InterfaceID", "{2d76cc2f-3488-417a-83d6-debff88b3c3f}");
Q_CLASSINFO("ToSuperClass", "QSubWidget");
public:
QSubWidget(QWidget *parent = nullptr, const QString &name = QString());
void setLabel(const QString &text);
QString label() const;
QSize sizeHint() const override;
protected:
void paintEvent(QPaintEvent *e) override;
private:
QString m_label;
};
QSubWidget類(lèi)有一個(gè)單一的字符串屬性標(biāo)簽,并實(shí)現(xiàn)paintEvent來(lái)繪制標(biāo)簽。該類(lèi)再次使用Q_CLASSINFO來(lái)提供COM標(biāo)識(shí)符,并將ToSuperClass屬性設(shè)置為QSubWidget,以確保只有任何超級(jí)類(lèi)(即QWidget)的插槽不被暴露。
QSubWidget::QSubWidget(QWidget *parent, const QString &name)
: QWidget(parent)
{
setObjectName(name);
}
void QSubWidget::setLabel(const QString &text)
{
m_label = text;
setObjectName(text);
update();
}
QString QSubWidget::label() const
{
return m_label;
}
QSize QSubWidget::sizeHint() const
{
QFontMetrics fm(font());
return QSize(fm.horizontalAdvance(m_label), fm.height());
}
void QSubWidget::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.setPen(palette().text().color());
painter.drawText(rect(), Qt::AlignCenter, m_label);
}
QSubWidget該類(lèi)的實(shí)現(xiàn)是不言自明的。
#include "objects.h"
#include <QAxFactory>
QAXFACTORY_BEGIN("{9e626211-be62-4d18-9483-9419358fbb03}", "{75c276de-1df5-451f-a004-e4fa1a587df1}")
QAXCLASS(QParentWidget)
QAXTYPE(QSubWidget)
QAXFACTORY_END()
然后使用QAxFactory導(dǎo)出這些類(lèi)。QParentWidget被導(dǎo)出為一個(gè)完整的類(lèi)(可以被創(chuàng)建),而QSubWidget只被導(dǎo)出為一個(gè)類(lèi)型,只能通過(guò)QParentWidget的API間接創(chuàng)建。
要建立這個(gè)例子,你必須首先建立QAxServer庫(kù)。然后在activeqt/hierarchy中運(yùn)行qmake和你的make工具。
該演示需要您的WebBrowser支持ActiveX控件,并啟用腳本。
<script language="javascript">
function createSubWidget( form )
{
ParentWidget.createSubWidget( form.nameEdit.value );
}
function renameSubWidget( form )
{
var SubWidget = ParentWidget.subWidget( form.nameEdit.value );
if ( !SubWidget ) {
alert( "No such widget " + form.nameEdit.value + "!" );
return;
}
SubWidget.label = form.labelEdit.value;
form.nameEdit.value = SubWidget.label;
}
function setFont( form )
{
ParentWidget.font = form.fontEdit.value;
}
</script>
<p>
This widget can have many children!
</p>
<object ID="ParentWidget" CLASSID="CLSID:d574a747-8016-46db-a07c-b2b4854ee75c"
CODEBASE="http://www.qt-project.org/demos/hierarchy.cab">
[Object not available! Did you forget to build and register the server?]
</object><br />
<form>
<input type="edit" ID="nameEdit" value="<enter object name>" />
<input type="button" value="Create" onClick="createSubWidget(this.form)" />
<input type="edit" ID="labelEdit" />
<input type="button" value="Rename" onClick="renameSubWidget(this.form)" />
<br />
<input type="edit" ID="fontEdit" value="MS Sans Serif" />
<input type="button" value = "Set Font" onClick="setFont(this.form)" />
</form>
下載Qt立刻體驗(yàn)吧!!
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@ke049m.cn
文章轉(zhuǎn)載自: