提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
翻译|使用教程|编辑:鲍佳佳|2021-04-07 11:15:16.837|阅读 205 次
概述:层次结构示例显示了如何编写进程内ActiveX控件。该控件是一个QWidget子类,带有子小部件,这些子小部件可以作为子类型进行访问。
#慧都22周年庆大促·界面/图表报表/文档/IDE/IOT/测试等千款热门软控件火热促销中>>
层次结构示例显示了如何编写进程内ActiveX控件。该控件是一个QWidget子类,带有子小部件,这些子小部件可以作为子类型进行访问。
开始前先介绍一下我们的Qt商业控件:
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 类提供了创建一个带有名称的小组件和返回一个命名小组件的指针的槽。类的声明使用Q_CLASSINFO()来提供这个类的COM标识符。
QParentWidget::QParentWidget(QWidget *parent)
: QWidget(parent),
m_vbox(new QVBoxLayout(this))
{
}
构造函数QParentWidget创建垂直框布局。新的子窗口小部件将自动添加到布局中。
void QParentWidget::createSubWidget(const QString &name)
{
QSubWidget *sw = new QSubWidget(this, name);
m_vbox->addWidget(sw);
sw->setLabel(name);
sw->show();
}
createSubWidget插槽以参数中提供的名称创建一个新的QSubWidget,并将标签设置为该名称。该小组件也被显式显示。
QSubWidget *QParentWidget::subWidget(const QString &name)
{
return findChild<QSubWidget *>(name);
}
子Widget槽使用QObject::findChild()函数,并返回具有请求名称的QSubWidget类型的第一个子系列。
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类有一个单一的字符串属性标签,并实现paintEvent来绘制标签。该类再次使用Q_CLASSINFO来提供COM标识符,并将ToSuperClass属性设置为QSubWidget,以确保只有任何超级类(即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该类的实现是不言自明的。
#include "objects.h"
#include <QAxFactory>
QAXFACTORY_BEGIN("{9e626211-be62-4d18-9483-9419358fbb03}", "{75c276de-1df5-451f-a004-e4fa1a587df1}")
QAXCLASS(QParentWidget)
QAXTYPE(QSubWidget)
QAXFACTORY_END()
然后使用QAxFactory导出这些类。QParentWidget被导出为一个完整的类(可以被创建),而QSubWidget只被导出为一个类型,只能通过QParentWidget的API间接创建。
要建立这个例子,你必须首先建立QAxServer库。然后在activeqt/hierarchy中运行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="//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立刻体验吧!!
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@hmdbvip.cn
文章转载自:



在嵌入式软件测试领域,对交叉编译代码进行单元测试是一大挑战。Parasoft C/C++test作为专业的C/C++测试工具,能够与劳特巴赫Trace32调试器深度集成。下面会详细介绍如何在C++test中配置Trace32调试器,实现对PowerPC架构程序的单元测试,涵盖环境设置、项目导入到测试执行的全过程。
本文将为大家介绍如何使用DevExpress WinForms数据网格控件实现摘要文本的格式化,欢迎下载最新版组件体验!
Parasoft C/C++test作为一款功能强大的自动化测试工具,为嵌入式开发提供了全面的测试解决方案。特别是在CCS开发环境中,C++test能够无缝集成,为F2812等DSP项目提供专业的单元测试支持。下面将介绍如何在CCS3环境下配置和使用C++test进行F2812项目的单元测试。
在嵌入式开发中,尤其是基于ARM架构的安全关键领域,单元测试是验证代码在目标硬件上运行时行为正确性的关键环节,对于保障最终产品的可靠性至关重要。下面将介绍如何利用Parasoft C/C++test开展单元测试,包括配置、执行及解决可能遇到的许可证问题,完成从静态检查到动态运行的完整测试闭环。
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@hmdbvip.cn
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢
永利最大(官方)网站 