如何将声明类型作为参数发送

How can i send the declaration type as parameter

本文关键字:参数 类型 声明      更新时间:2023-10-16

我有一个类BaseItem,它有addToDb((方法,类Car和类驱动程序的Car和Driver都基于"BaseItem"。

类 CarEditor 和类 DriverEditor 基于 QWidget,它们都有一个附加方法 BaseItem* getData((。

类 "TheEditor" 基于 QWidget 它有 QStackWidget, page_1有QLineEdit(搜索(和QListWidget, page_2是一个QWidget(编辑的哪个应该是他们的(。

此外,所有基于 Widget 的类都是使用 qdesigner 创建的。

问题是当我将"QWidget *editor"作为QWidget作为参数发送到TheEditor时,我无法访问getData((方法,因为它不在QWidget中,我也无法投射它,因为我不知道它是CarEditor还是DriverEditor或其他

如何将CarEditor或DriverEditor或其他类似的内容放在第二页并使用getData((方法?

知道从 add(( 方法获取 BaseItem* 后我唯一要做的就是调用它。

我认为最明显的解决方案是使用BaseItem *getData()虚拟方法创建一个BaseEditorQWidget派生类。然后CarEditorDriverEditor继承并覆盖getData()TheEditor使用BaseEditor实例而不是泛型QWidget。如有必要,可以将BaseEditorsqobject_cast()到实际类型。

BaseEditor类可能非常简单:

#include <QWidget>
class BaseItem;
class BaseEditor : public QWidget
{
Q_OBJECT
public:
using QWidget::QWidget;  // use base class constructors
virtual BaseItem *getData() const { return nullptr; }
};

例如CarEditor

#include "BaseEditor.h"
#include "Car.h"
class CarEditor: public BaseEditor
{
Q_OBJECT
public:
using BaseEditor::BaseEditor;
BaseItem *getData() const override { return m_car; }
private:
Car *m_car = nullptr;  // presumably this would get set somehow to !null :)
};

增加:要将自定义BaseEditor用作QtDesigner中现有CarEditorDriverEditor的基类(而不是QWidget(,可能需要执行额外的步骤。尽管将自定义小部件添加到现有表单(使用描述的第一种方法(很简单,但据我所知,一旦创建了 .ui 表单,就无法更改基本类型。

但是,您可以通过直接编辑表单的.ui文件 XML 来手动执行此操作。首先在QtDesigner/Creator中关闭文件。 然后在纯文本编辑器中打开它(例如,在 Creator 项目树中单击文件并选择 打开方式 -> 纯文本编辑器(。

在顶部将是这样的:

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>CarEditor</class>
<widget class="QWidget" name="CarEditor">
...
</widget>
...
</ui>

编辑它以更改基类名称并添加customwidget详细信息:


<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>CarEditor</class>
<widget class="BaseEditor" name="CarEditor">
...
</widget>
<customwidgets>
<customwidget>
<class>BaseEditor</class>
<extends>QWidget</extends>
<header>BaseEditor.h</header>
<container>1</container>
</customwidget>
</customwidgets>
...
</ui>

保存,一旦在QtDesigner中重新打开,它应该会显示正确的基类。 请注意,如Informit文章中所述,这不会反映BaseEditor的任何自定义属性,但它可以让您像编辑普通QWidget一样编辑设计。