我正在使用Qt库。我目前正在尝试创建自己的QDockWidget(MY类正在继承)。现在我的班级有一个到QDockWidget的ptr。这甚至有意义吗?这是一份法律声明吗?有没有更好的方法将QDockWidget与我在Qt中的其余程序分开?我对如何实现新的Dock Widget感到有点迷茫。这是MY QDockWidget类的副本:
#ifndef DOC_MENU_WIDGET_H
#define DOC_MENU_WIDGET_H
#include "App_interface.h"
#include <QObject>
#include <QWidget>
#include <QDockWidget>
class Doc_menu_widget : public QWidget
{
//Q_OBJECT
public:
Doc_menu_widget(App_interface *parent);
~Doc_menu_widget();
private:
QDockWidget *dock_widget;
};
#endif
答案 0 :(得分:3)
您似乎混淆了IS-A关系和HAS-A关系。
IS-A关系是通过继承实现的。例如,QWidget
IS-A QObject
。
HAS-A关系由成员实施。例如,QWidget
HAS-A大小。
现在,您正在尝试开发的类和QDockWidget之间的关系是什么?这将告诉你应该选择哪两个。
答案 1 :(得分:1)
你不应该这样做吗?
class Doc_menu_widget : public QDockWidget
{
// ...
};
对QWidget
进行子类化,然后拥有私有QDockWidget
属性当然有意义,但它可能无法帮助您实现“自己的Dock小部件”(只要我理解正确) 。您只能以这种方式获取原始停靠窗口小部件,并且可以将其放置在新窗口小部件中的某个位置。
或者,如果您想从头开始实现等效的QDockWidget
,则可能不需要私有QDockWidget
。
答案 2 :(得分:0)
当然,为什么不呢。如果你只是将ptr用于基类对象,那么你就没有了 完全没问题。
为什么不首先直接从QDockWidget派生?
你想表达:
(a)Doc_menu_widget IS-A QDockWidget - &GT;导出
(b)IS-IMPLEMENTED_IN_TERMS-OF QDockWidget(与PERFORMS-LIKE相同 QDockWidget) - &gt;使用私人会员
答案 3 :(得分:0)
如果您只需要为QDockWidget*
创建QMainWindow
,则大多数情况下您只需创建一个实例并立即使用它:
QDockWidget* dock = new QDockWidget(this);
dock->setWindowTitle("My Dock Widget");
addDockWidget(Qt::LeftDockWidgetArea, dock, Qt::Vertical);
如果您想要创建具有不同行为或外观的自定义QDockWidget
,那么从QDockWidget
继承可能更方便:
#include <QDockWidget>
class MyDockWidget : public QDockWidget
{
Q_OBJECT
// ...
};
拥有一个拥有QDockWidget*
私人成员的单独课程当然是完全可行且合法的,但在这种情况下,这不是最常见的选择。
原因是你很可能希望你的类是QDockWidget
( is-a 关系)的变体,这意味着它应该拥有所有公共方法,并且它的实例应该能够传递给询问QDockWidget
个实例的方法(例如,您希望能够将一个添加到QMainWindow
)。