在许多情况下,我想覆盖Qt类来扩展或修改它的行为。但是几乎所有Qt类都使用QNetworkDiskCache中的内部私有类,如QNetworkDiskCachePrivate。我知道这种方法有优点。但私人阶层存在一个巨大的问题:它使得超越班级变得更加困难。对于带有源代码的其他C ++类库,我通常会覆盖一个类方法,从父类的实现中复制代码,并在此处进行小的修改以实现我想要的行为。但是,在Qt中,私有类不会导出,也不会对派生类可见。由于Qt类通过“d”成员维护私有类中的关键内部数据,因此私有内部类的不可见性使得行为扩展的可能性非常有限。您只能使用少数暴露的公共方法。
我尝试提取类的整个源文件并重命名类名和文件名。但Qt类库交织在一起,以至于在大多数情况下从中提取单个类都很混乱。
我在这里想念一下吗?或者Qt类在可扩展性方面真的很糟糕?
答案 0 :(得分:1)
Qt类在可扩展性方面优于大多数类;他们经常有钩子来改变他们的行为而不需要复制和粘贴整个方法。话虽如此,如果普遍接受的扩展方法不起作用,是的,Qt类更难以破解。这可能是件好事,因为复制粘贴和修改基类实现意味着派生类不会得到基类实现中的任何改进或错误修正。
如果你想这样做,你需要说服你的构建系统让你包含私有头,然后从你的新实现中引用私有类。注意Qt文档中的免责声明;当你这样做的时候,你正在打开自己的每一个新版本的Qt(Qt只保证公共API,你正在弄乱它的内部)。 Qt的公共API具有非常好的可读性和记录性;内部代码可能非常神秘,所以你真的,真的想确保你无法用公共API完成你想要的东西。如果你仍然决定使用私人课程,this might help。
答案 1 :(得分:-1)
你的方法是错误的和坏的!要扩展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
通过这种方式,B可以完成基类A的所有操作,并添加方法(扩展基类)以满足您的需求。如果你看一下qt示例代码,这通常是用于执行默认qt小部件行为中未包含的内容的方法。在示例ItemDelegate自定义中:您编写自己的类MyItemDelegate,扩展QItemDelegate:link
或者Qt类在可扩展性方面真的很糟糕?
Qt是“唯一”构建C ++语言的框架。这意味着您可以使用Qt在C ++中执行的所有操作。