【问题标题】:How to know if a Qt form valid如何知道 Qt 表单是否有效
【发布时间】:2014-01-10 21:53:16
【问题描述】:

我目前有一个从 QMainWindow 派生的名为 `foo' 的 Qt 表单类。

现在在其他班级我有类似的东西

class someclass
{
   private:
      foo* form;
   ......
   public:
      someclass()
      {
          form = NULL; 
      }    
};

现在 someclass 中有一个方法需要知道 foo* 在指向时是否有效 到一个有效的 foo 形式。我想知道实现这一目标的最佳方法是什么。我应该去吗

if(form!=NULL) {...}

问题是上述方法不能保证一个可靠的有效形式。有什么建议吗?

【问题讨论】:

  • @Charles:请不要删除与主题密切相关的任何标签。您不仅不必要地提出问题,而且还将 Q/A 从与其相关的类别中删除。
  • @Laszlo,我正准备用大量的元链接来打击你,这些元链接表明你不应该将库标签添加到标签仅适用于答案的问题中,但我显然完全记错了之前的社区共识。对于我的正义标签燃烧造成的不便,我深表歉意。
  • @Charles:不用担心。

标签: c++ qt qmainwindow qtcore


【解决方案1】:

我认为您正在寻找智能指针。通常,此检查由弱指针完成。这不会持有对象的所有权,但它可以使用isNull() method 检查有效性。

Qt 为此建立了一个方便的类,称为QWeakPointer。它通常与共享指针配对使用,在 Qt 世界中为QSharedPointer

QWeakPointer 类持有对共享指针的弱引用

QWeakPointer 是对 C++ 中指针的自动弱引用。它不能用于直接取消引用指针,但可以用于验证指针是否已在另一个上下文中被删除。

QWeakPointer 对象只能通过 QSharedPointer 的赋值来创建。

这里是你可以实际使用的方法来查看拥有对象的主 QSharedPointer 是否删除了引用的指针。

bool QWeakPointer::isNull() 常量

如果此对象持有对空指针的引用,则返回 true。

请注意,由于弱引用的性质,QWeakPointer 引用的指针在任何时候都可能变为空,因此从该函数返回的值可以从一次调用到下一次从 false 变为 true。

这样,其他类不需要获取对具有所有权的指针的引用,但根据您的具体用例,您可以到处使用 QSharedPointer。

【讨论】:

  • sharedptrs 在传递父对象时不能很好地与 QObject 一起工作(您应该始终对对话框执行此操作,以免破坏窗口堆叠),因为父对象和 sharedptr 都拥有所有权,并且 sharedptr 将导致双删除,以防父级先删除。因此,在 Qt 上下文中,我会小心使用诸如“您可以到处使用 QSharedPointer。”之类的语句。
  • @FrankOsterfeld:嗯,“无处不在”的意思似乎并没有在这句话中体现出来。 :) 它试图引用每个地方,例如:具有共享指针成员的类以及可以访问该成员的任何外部代码。这个词并不是指“每个场景”。 Fwiw,我什至写了“取决于你的用例”,这意味着不是在每个场景中。如果您认为可以更清楚地提出修改建议,请随时提出建议,但我认为除非有任何其他问题,否则意图仍然正确。
  • 至于父/子关系,如果您希望确保指针有效,我不确定这最终是否是正确的方法。我个人认为这些信息与 OP 的意图无关。也许,OP 只是试图提供尽可能多的信息,但无论哪种方式,我个人都没有看到无父主窗口的最终问题。如果是这样,API 可能会禁止它。 :)
【解决方案2】:

根据 foo 类的范围使用 QScopedPointer 或 QSharedPointer 而不是 foo*。这将允许可靠地检查指针是否有效,将指针与 null 进行比较将无助于检测指向野外的已删除指针。

【讨论】:

    猜你喜欢
    • 2020-03-12
    • 1970-01-01
    • 2017-01-22
    • 1970-01-01
    • 1970-01-01
    • 2018-12-12
    • 2013-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多