Qt 和 C++:覆盖或展开 Class

Qt and C++: Overwrite or Expand Class

我想向 QPushButton 添加一些属性(如 ID)。因此,我需要扩展或覆盖 class Q_WIDGETS_EXPORT QPushButton : public QAbstractButton

我该怎么做?

感谢您的帮助。

这真的取决于用例。从 Qt-(Widget) 继承没有问题(通常是预期的方式)类(如果我错了请纠正我)。
所以你可以这样做:

class MyQPushButton : public QPushButton
{
     Q_OBJECT
public:
     MyQPushButton() : QPushButton(...) {}
private:
    int ID = -1;
}

Qt 有非常好的文档,您可以查看源代码以了解要覆盖的内容。

您也可以使用 QPushButton 扩展一个新的 class,但是如果您需要,您总是必须处理 class 中的 QPushButton 引用,例如连接一些东西。在继承的class中可以连接插槽等等。但是例如你可以这样做:

class MyQPushButton 
{
public:
     MyQPushButton() {}
     const QPushButton& const GetQPushButton() { return pushButton; }
     const QPushButton* const GetQPushButtonPtr() { return &pushButton; }

private:
     QPushButton pushButton;
     int ID = -1;
}

没有对错之分。但我会将继承用于 Qt-classes.

你不需要扩展 class 来只在里面放一个 id ...而是使用 property system.

官方指定的doc here:

A property can be read and written using the generic functions QObject::property() and QObject::setProperty(), without knowing anything about the owning class except the property's name.

你只需要做:

ui->myButton->setProperty("Id", 123456);

也可以是另一个对象,例如一个字符串(或者甚至是你自己的 class 如果你定义它来做到这一点)

ui->myButton->setProperty("_name", "123456");

阅读 属性 是适合您的方法 property() 但请阅读文档,因为您会得到 QVariant 作为 return 示例:

 QVariant(int, 123456)