c++ - 我如何将声明类型作为参数发送

标签 c++ qt

我有一个 BaseItem 类,它有 addToDb() 方法,Car 类和 Driver 类 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* 后我唯一要做的就是调用它。

最佳答案

我认为最明显的解决方案是创建一个 BaseEditor QWidget 派生类,其中包含一个 BaseItem *getData() 虚方法。然后 CarEditorDriverEditor 继承并覆盖 getData()TheEditor 的实例一起工作BaseEditor 而不是通用的 QWidget。如果需要,BaseEditor 可以是 qobject_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 :)
};

添加:在 QtDesigner 中使用自定义 BaseEditor 作为现有 CarEditorDriverEditor 的基类(而不是 QWidget) 可能需要一个额外的步骤。虽然很简单add a custom widget to an existing form (使用所描述的第一种方法),一旦创建了 .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 文章所述,这不会反射(reflect) BaseEditor 的任何自定义属性,但它会让您像编辑普通 一样编辑设计QWidget.

关于c++ - 我如何将声明类型作为参数发送,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57862440/

相关文章:

c++ - 错误 : ‘make_reverse_iterator’ is not a member of ‘std’

c++ - 从 QList 中删除重复项

c++ - QML 与 Qt for Embedded System 在 uclinux 上一起运行吗?

c++ - 没有匹配运算符[]

c++ - QLabel在调整大小时切断文本

c++ - 数值包装器

c++ - 函数参数作为常量引用

c++ - 使用 QGLShaderProgram 将自定义类型(结构)统一从 Qt 传递到 GLSL

qt - Qt程序在右键单击时崩溃

Qt - 如何在顶部而不是底部显示 tabified dockwidget 的选项卡