【问题标题】:Why a layout is required for multiple widgets recieving events?为什么多个小部件接收事件需要布局?
【发布时间】:2016-08-29 14:57:16
【问题描述】:

我实际上是在 qt (container) 中编写一个模块,该模块来自 QWidget,其中包含多个 plots,呈现一个 graph,其中所有这些模块都来自 QWidget

所以给定了:

  • 1 container 可以有:
    • n plots 其中每个都包含
    • 1 graph.

昨天我花了很多时间来找出一个错误。 碰巧只有 n 个plots(出于调试目的)在其构造函数中添加到容器中以捕获绘制事件。

container 已构建完成时通过相同方法添加的所有plots 都无法接收任何事件。

稍后,在我请求帮助后,一位同事向我解释说,我的 container(位于 mainwindow-form 中)需要在 Qtdesigner 中分配一个布局。我试了一下,很惊讶它确实解决了我的问题。将动态生成的plots 添加到container 并将它们添加到布局后,所有小部件都按预期接收事件。

但是由于我无法理解他的解释,也不想再打扰他,所以我在这里问。

那么,为什么作为其他动态生成的 QWidget 的子对象的动态生成的小部件需要作为 mainwindow 的子对象的父对象来分配布局? 如果这不仅仅是一个例外情况,为什么默认情况下没有分配它,而且我无法在网上找到有此类问题的案例?

【问题讨论】:

  • 恕我直言,您应该编辑问题以删除对您同事的任何引用。提到其他人无法回答并想象他会读到这个......的问题并不真正相关
  • @tobi303:我什至不想让他显得更糟糕,以表明我不太喜欢 qt,因此我希望它有点相关。但你可能是对的。
  • 什么事件?我希望看到一个 SSCCE 来演示这个问题。
  • @thuga: qt 事件循环的任何事件。嗯,不太确定要放入什么,因为我正在动态创建对象并且我还不知道可能导致问题的原因。虽然只是做一个layout->addWidget(fop); 让事情顺利进行。所以我的问题的主要部分是在 qt-designer 中完成的,而另一部分将是很多行只是配置小部件。您能帮我确定这里的 SSCCE 需要什么吗?
  • 复制问题的尽可能小而紧凑的代码。您可以使用一些虚拟小部件,它们除了听一些事件外,并没有真正做任何事情。您在设计器中所做的一切都可以在代码中完成。您可以查看 this answer 以获取 SSCCE 的一个很好的示例。

标签: c++ qt inheritance qt-designer qt-events


【解决方案1】:

您可能会看到重叠同级小部件的副作用,或者尺寸为零的小部件。布局所做的只是调整它们的大小并确保它们不重叠。

在其构造函数中添加到容器中以捕获绘制事件

你所说的“cathing”绘制事件是什么意思,这与任何构造函数有什么关系?您声称您的所有类(容器、绘图和图形)都派生自 QWidget。它们都应该实现paintEvent,除非它们被设计为除了默认背景画笔之外没有自己的内容。

我想您在某种程度上使事情变得过于复杂,但是如果没有我们可以编译以复制您的问题的自包含代码段,我们将绕圈子。随意look around in my answers:它们都由一个main.cpp 组成,有时还包含相当多的功能。几乎普遍地,除了演示给定技术所必需的代码之外,没有其他代码。您的问题应包括类似的最小化、可编译示例。

【讨论】:

    猜你喜欢
    • 2019-01-15
    • 1970-01-01
    • 1970-01-01
    • 2022-06-29
    • 1970-01-01
    • 2019-08-10
    • 1970-01-01
    • 2018-08-14
    • 1970-01-01
    相关资源
    最近更新 更多