确定QT中父型的类型
Determining type of parent form in Qt
我有一个带有表X的数据库:我们称其为 clients
。我也有与编辑表x内容有关的表格。它可能会自行打开(浏览/编辑)以及从表X中"选择"记录时从其他形式打开。
我该如何告诉父母,特定的QModelIndex
已直接从on_tableView_doubleClicked(const QModelIndex &index)
信号处理程序中挑选出来?
目前,我只有一种"爸爸"表格,所以我知道要将哪种指针放入子形式(因此它可以容纳父母的指针),然后铸造了它的类型指针。
if (parent) daddy = qobject_cast<InvoiceEd*>(parent);
现在,我想添加来自另一种形式的呼叫,我意识到我必须将其他指针从QWidget*
指针中投射出来,并且我不知道如何确定QWidget* parent
指针下的"变相"。我该怎么做?
我建议使用接口和dynamic_cast
传递有关选定项目的信息:
InvoiceEdInterface.hpp
:
class InvoiceEdInterface {
public:
virtual void SetSelectedItem (SelectedItemClass i_selected_item) = 0;
};
InvoiceEd.hpp
:
class InvoiceEd: public InvoiceEdInterface {
public:
void SetSelectedItem (SelectedItemClass i_selected_item) override {
// Process setting selected item.
}
};
DataForm.hpp
class DataForm {
...
void on_tableView_doubleClicked(const QModelIndex &index) {
auto invoice_ed {dynamic_cast< InvoiceEdInterface* >(parent ())};
if (invoice_ed) {
invoice_ed->SetSelectedItem (...);
}
}
...
};
解决方案背后的想法非常简单:如果父窗口小部件实现了指定的接口,则称为SetSelectedItem()
。否则,什么都不会发生。
DataForm
对象以选择某些项目时,父窗口小部件应建立信号插槽连接。该解决方案比上述解决方案更灵活,因为它允许程序中的任何对象获取有关所选项目的信息。
两种建议的解决方案动态工作,而没有基于模板的解决方案的局限性。
在某些现有方法实现中有一个代码来解决小部件类型:
// dataform.cpp
void DataForm::myEdit()
{
///
if (parent()) daddy = qobject_cast<InvoiceEd*>(parent());
}
作者希望使其更灵活,例如特别是根据呼叫者施放某些小部件类型。可以做到。让我们将所需类型传递给它:
class DataForm
{
public:
// was void myEdit()
template <typename T = InvoiceEd> // defaults to InvoiceEd
void myEdit()
{
///
T* daddy = qobject_cast<T*>(parent());
// now we operate with the proper pointer so that
// exact instance does virtual function calls etc.
}
///
};
pDataForm->myEdit(); // default case
pDataForm->myEdit<MutatedInvoiceEd>(); // specified case
P.S。以上是没有批评令人怀疑的设计。在OOP中,我们通常不想知道该方法是从调用该方法或对象不想识别的上下文。在这种情况下,您应该为不同用途创建两种不同的方法,或者提供其他参数(也许使用默认值void myEdit(bool insideOfContainerEdit = true)
,以便代码知道某些主要用例。有许多方法可以处理,但我们看不到整个代码你的。
但是,当然,C 中模板的存在使我们能够将问题解决到程度上。我本人在模板中找到帮助,有时避免编写更多代码或从类型等中得出,但是过度使用这种方法会导致很多头痛。理想情况下,我们应该依靠多态性的继承或完全通过具有参数类型的模板处理此类情况。
- 从父命名空间重载类型
- 给定一个类型,如何派生一个泛型更广泛的类型(例如,用于溢出安全求和)?
- 泛型枚举和其他类型的重载模板函数
- 使用泛型类型推送到堆栈时出现问题
- 为什么在传递长整型时调用具有两个双精度类型的参数的重载函数?
- 以特征类型作为参数的泛型函数回调
- 将整型常量映射到类型
- 提升不良词法强制转换:将字符串转换为无符号长整型时,无法将源类型值解释为目标
- 为什么C++不允许两个同名的函数/类模板,区别仅在于非类型模板参数(整型)的类型?
- 如何在容器中指定模板化别名的泛型类型
- 具有纯虚函数和指针数组对象类型的父类的指针数组
- 无符号长整型和无符号 int 之间有什么区别,这 2 种类型应该如何在 c# 中封送?
- 具有模板专用化的泛型类型转换
- 将-Wtype限制与类型泛型代码一起使用
- 为什么允许将整型、枚举和指向成员的指针类型reinterpret_cast到自身?
- 确定QT中父型的类型
- 找出父型向量元素的子类型
- 为什么C类型泛型表达式不能与C++兼容
- 如何在 Java 中模拟'question mark(?)'类型泛型以C++?
- 构造函数不允许返回类型(泛型链表)