• task ui 布局
    QGridLayout *gridLayout_3;
    	QGroupBox *groupBox;
    		hboxLayout = new QHBoxLayout(groupBox);
    		hboxLayout->addWidget(label);
    		hboxLayout->addWidget(shapeObject);
    QFormLayout *formLayout
    	formLayout->setWidget(1, QFormLayout::LabelRole, labelfillet);
    	formLayout->setWidget(2, QFormLayout::SpanningRole, treeView);
    	formLayout->setWidget(3, QFormLayout::LabelRole, DeleteButton);
    
  1. void DlgGetNeighborFaces::on_shapeObject_activated(int itemPos)
    

    这段代码是同一个 Qt 对话框类的另一个成员函数,用于响应对象下拉列表中的条目被选中的事件。在函数中,首先将当前对象的指针(d->object)置为 nullptr,并清空树形视图的所有行(model->removeRows(0, model->rowCount()))。然后获取当前活动文档的指针(App::GetApplication().getActiveDocument()),如果指针为空则直接返回。

    接着使用 Gui::WaitCursor 对象展示等待光标,以防止用户在读取复杂模型时对界面进行操作。接着从对象下拉列表中获取用户所选的对象名,并将其转换为 QByteArray 类型的 name 变量。随后通过调用 doc 的 getObject 函数来获取与该对象名对应的 App::DocumentObject 对象(docObj)。在获取到 docObj 后,将 d->object 的值设置为该对象,并调用 tool 对象的 getAllFacesOfASolidOfDocument 函数获取与该对象相关联的所有面(TopTools_IndexedMapOfShape allFace)。

    接着调用 tool 对象的 getSelectedFaces 函数获取当前已经选择的面,并将它们保存到 selectedFaces 中。再调用 Gui::Selection().rmvSelection 函数取消选择当前对象上的所有元素。最终调用 tool 对象的 getAllNeighborFacesIdOfNoPlane 函数获取所有不在同一平面上但相邻的面,并将结果保存到 d->face_ids 中。

    接下来向树形视图中插入 d->face_ids.size() 个行(model->insertRows(0, d->face_ids.size())),然后对于每个面,设置树形视图中的数据。具体来说,调用 model 对象的 setData 函数设置每个行的第一列为 "FaceX",其中 X 是 face id;第二、三列分别为面的曲率半径(Base::Quantity 类型);第一列还会根据当前是否选中该面而设置相应的 Qt::CheckStateRole 属性。

    最后,在处理每个面时,会检查是否能够获取到该面的曲率半径信息,如果获取失败则弹出提示框并直接返回。

  2. protected:
    	bool eventFilter(QObject* target, QEvent* event);
    	void findShapes();
    	void changeEvent(QEvent* e) override;
    	virtual const char* getShapeType() const;
    
    1. void findShapes();
      这段代码定义了一个函数 findShapes(),该函数用于在当前激活的文档中查找所有类型为 Part::Feature 的对象,并将它们添加到界面上的下拉框 ui->shapeObject 中。如果当前已有选中的对象,则将其设为默认选中状态。

      具体来说,该函数首先获取当前激活的文档 activeDoc,并通过调用 getObjectsOfType(Part::Feature::getClassTypeId()) 函数获取文档中所有类型为 Part::Feature 的对象,并将这些对象存储在一个 std::vectorApp::DocumentObject* 类型的数组 objs 中。接着,遍历 objs 数组中的每个元素,将其名字作为一个选项添加到下拉框 ui->shapeObject 中,并使用 setItemData 函数将该对象的名称与在文档中的名称绑定。同时,如果该对象已被选中,则将当前选中的对象索引 current_index 设为该对象的索引 index,以便在添加完所有选项后将该选项设为默认选中状态。

      最后,如果在整个文档中只有一个 Part::Feature 类型的对象,则将其默认设为选中状态,并触发 on_shapeObject_activated 槽函数。

    2. void changeEvent(QEvent* e) override;
      这段代码是一个重载函数 changeEvent(QEvent* e),用于处理特定的事件类型 QEvent::LanguageChange。

    当接收到 QEvent::LanguageChange 事件时,该函数会执行以下操作:

     获取当前下拉框 ui->shapeObject 的选中索引,并获取所有选项的名称和绑定的数据。
     调用 ui->retranslateUi(this) 函数更新界面的翻译文本。
     清空下拉框 ui->shapeObject 的所有选项,并重新添加之前保存的选项及其绑定的数据。
     将下拉框 ui->shapeObject 的选中状态恢复到之前的索引位置。
     遍历树形结构控件 ui->treeView 中的每个节点,将其用户自定义的数据(存储在 Qt::UserRole 中)转换为整数类型,并将其对应的翻译文本设置为“FaceX”,其中 X 是该节点所代表的面的编号。
    

    如果接收到的事件类型不是 QEvent::LanguageChange,则调用 QWidget::changeEvent(e) 函数将事件交给其父类来处理。

posted on 2023-04-06 18:01  FrostyForest  阅读(11)  评论(0编辑  收藏  举报