封装 QWidgets 的正确方法?

Posted

技术标签:

【中文标题】封装 QWidgets 的正确方法?【英文标题】:Proper way to encapsulate QWidgets? 【发布时间】:2010-12-28 13:06:51 【问题描述】:

我正在制作一个 Qt 小部件(我们称之为 A),它实际上是一个子类 QGraphicsView。但是,我不想在我的小部件中公开 QGraphicsView 方法,只是基本的 QWidget 接口和我自己的一些方法。因此,我想将A 的一个实例封装为一个简单的QWidget 子类的成员,我们称之为B

现在我想知道,绘制这个的正确方法是什么?到目前为止,我已经给B 一个布局,其唯一的项目是A 成员。但这感觉有点不对劲。例如,我需要覆盖默认布局设置以避免添加额外的边距等。这让我觉得有一些我缺少的正确方法可以做到这一点。有什么想法吗?

编辑:在 RedX 的回答设置中,我的问题变成:在此设置中使用gv 的正确方法是什么?给A一个布局并添加gv,或者覆盖A的绘画方法来代替gv的那些?还是别的什么?

【问题讨论】:

【参考方案1】:

我认为没有更好的方法。如果您不想使用布局,可以像这样覆盖父级的 resizeEvent():

void A::resizeEvent( QResizeEvent* ) 
    m_graphicsView->setGeometry( QRect( 0, 0, size() ) );
 

【讨论】:

【参考方案2】:

我认为您正在尝试这样做?

class A : public QWidget
  QGraphicsView* gv; //use this to do whatever you need
;

这应该将 a 作为 QWidget 公开,并且在内部您可以使用 gv 从 QGraphicsWidget 执行您需要的任何操作。

【讨论】:

是的,这就是现在的设置。那么问题就变成了:在此设置中使用 gv 的正确方法是什么?给A 一个布局并添加gv ,或者覆盖A 的绘画方法来代替使用gv 的那些?还是别的什么? 如果你只是想减少一些边距,覆盖paint方法似乎是矫枉过正。使用A 中的布局并将gv 添加到其中。这也应该使意图更清晰。 好的,这就是我要做的。我同意你的推理。我只是想检查一下是否有其他方式被认为是“正确的方式”。

以上是关于封装 QWidgets 的正确方法?的主要内容,如果未能解决你的问题,请参考以下文章

odoo widgets.js 笔记

不能使用 QWidgets

从 QLayout 中删除 QWidgets?

自定义形状的 QWidgets 消失

QWidgets可以添加到QWindow吗?

XSS过滤