使用嵌入的私有类重写Qt类

Ste*_*eng 7 c++ qt

在许多情况下,我想覆盖Qt类来扩展或修改它的行为.但是几乎所有Qt类都使用QNetworkDiskCache中的内部私有类,如QNetworkDiskCachePrivate.我知道这种方法有优点.但私人阶层存在一个巨大的问题:它使得超越班级变得更加困难.对于带有源代码的其他C++类库,我通常会覆盖一个类方法,从父类的实现中复制代码,并在此处进行小的修改以实现我想要的行为.但是,在Qt中,私有类不会导出,并且对派生类不可见.由于Qt类通过"d"成员维护私有类中的关键内部数据,因此私有内部类的不可见性使得行为扩展的可能性非常有限.您只能使用少数暴露的公共方法.

我尝试提取类的整个源文件并重命名类名和文件名.但Qt类库交织在一起,以至于在大多数情况下从中提取单个类也很混乱.

我在这里想念一下吗?或者Qt类在可扩展性方面真的很糟糕?

Alb*_*rto -2

你的做法是错误的、糟糕的!要扩展 Qt 以及更一般的 C++ 代码,您不必复制源代码并在需要的地方进行修改。您应该(必须)使用扩展 OOP(面向对象编程)范例。在 C++ 中你应该这样写:

#include <iostream>

using namespace std;

class A
{
public:
    A(){x=1;}
    void writeName(){cout << "my name is A";}
    void writeNumber(){cout << "my number is " << x << endl;}
private:
    int x;
};

class B : public A
{
public:
    B(){}
    void writeName(){cout << "my name is B and i'm better then A" << endl;}
};

int main()
{
   B *b= new B();
   b->writeName();
   b->writeNumber();
   return 0;
}

//output:
my name is B and i'm better then A
my number is 1
Run Code Online (Sandbox Code Playgroud)

通过这种方式,B 可以完成基类 A 所做的所有工作,并且您可以添加方法(扩展基类)来满足您的需求。如果您查看 qt 示例代码,这通常是用于执行未包含在默认 qt 小部件行为中的操作的方法。在示例 ItemDelegate 自定义中:您编写自己的类 MyItemDelegate 来扩展 QItemDelegate:链接

或者 Qt 类在可扩展性方面真的很糟糕?

Qt“只是”一个构建C++语言的框架。这意味着您可以在 C++ 中完成的所有操作都可以使用 Qt 完成。