如何将声明类型作为参数发送
How can i send the declaration type as parameter
我有一个类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()
虚拟方法创建一个BaseEditor
QWidget
派生类。然后CarEditor
和DriverEditor
继承并覆盖getData()
,TheEditor
使用BaseEditor
实例而不是泛型QWidget
。如有必要,可以将BaseEditor
sqobject_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中现有CarEditor
和DriverEditor
的基类(而不是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
一样编辑设计。
- 扩展C++生成的代码的模板参数类型名称
- 如何在 c++ 中定义接受不同参数类型的函数向量?
- 在 C++ 中运行时调用模板时,是否可以切换模板的参数类型?
- 将函数参数类型声明为 auto
- 将函数的参数 - 签名从使用 'std::function<T>' 转换为模板参数类型
- 在 C++17 中调用具有不同参数类型的构造函数
- 具有先前参数类型匹配的参数包
- 我想知道为什么"std::unique_ptr<int> foo(新 int)"是合法的,因为"std::<int>unique_ptr"要求输入参数类型应该是"int"?
- 将可变参数类型列表的扩展打包为复杂类型的初始值设定项列表 - 合法吗?
- MSVC 错误:4 个重载中的任何一个都无法转换所有参数类型
- 使用constexpr + auto作为返回和参数类型的奇怪类型推导
- 如何从第一个参数推断第二个参数类型?
- C++模板函数中,指定回调函子/lambda 的参数类型,同时仍允许内联?
- 如何用不同的参数类型和数字回调函数
- C++stoi:这两个重载都无法转换所有参数类型
- 为什么std::{container}::template不能推导其参数类型
- 为模板参数类型中的新对象分配内存
- 为指向成员模板参数的指针推导额外模板参数类型的紧凑方式
- 使用std::conditional中的模板来确定函数参数类型
- C++中的短参数类型