【问题标题】:qobject_cast<QVBoxLayout*>(layout()), is the appropriate cast?qobject_cast<QVBoxLayout*>(layout()),是合适的演员吗?
【发布时间】:2016-04-08 15:20:10
【问题描述】:

考虑到布局是在QWidget 中设置的,代码如下:

setLayout(new QVBoxLayout);

然后需要检索它(向布局添加更多内容)。这是通过以下代码完成的:

QHBoxLayout *hLayoutTime(new QHBoxLayout);
qobject_cast<QVBoxLayout*>(layout())->addLayout(hLayoutTime);

qobject_cast 是否适合在这里使用?

【问题讨论】:

  • 没关系,其实static_cast在这里会更好。另一方面,您正在制造不必要的问题。只需使用局部变量来构建您的布局结构。

标签: c++ qt c++11 qt4 qt5


【解决方案1】:

为了避免不必要的转换,这样写:

void YourWidget::setupContents()
{
     QVBoxLayout *vLayout = new QVBoxLayout(this); // effectively this does setLayout(new QVBoxLayout);

     QHBoxLayout *hLayoutTime(new QHBoxLayout);
     vLayout->addLayout(hLayoutTime);
     … … …
}

【讨论】:

    【解决方案2】:

    查看当前示例中的代码,为什么不直接在创建时获取指针?

    auto *vLayout = new QVBoxLayout;
    auto *hLayoutTime = new QHBoxLayout;
    vLayout->addlaout(hLayoutTime);
    

    回答您的问题,最合适的演员阵容可能是:

    dynamic_cast<QHBoxLayout*>(new QVBoxLayout);
    

    dynamic_cast 比 static_cast 有几个检查和好处,所以最好尽可能使用它。

    【讨论】:

    • 我想知道@Marek R 在dynamic_cast 方面是否同意你的看法。
    • @KcFnMi 好问题 ;-)
    • qobject_cast 等价于dynamic_cast,但特定于 Qt。我在某处读到dynamic_cast 遇到了一些库问题,而qobject_cast 没有这个问题(我没有存储链接我会尝试找到它)。
    • 文档还提到了一些事情:doc.qt.io/qt-5/qobject.html#qobject_cast Qt 代码中的底线QObjects 如果需要,请使用qobject_cast
    • 当然 Qt 会一直推动 Qt 技术,但我的经验是:尽可能少地使用 Qt,你会避免麻烦:他们的完整库有很多非常糟糕的设计决策,难以集成QT 与其他人(例如他们的错误内存释放)。使用自定义转换函数/宏是 IMO 也是一个冒险的赌注。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-16
    • 2014-12-24
    • 1970-01-01
    • 1970-01-01
    • 2015-05-06
    • 2011-05-29
    • 1970-01-01
    相关资源
    最近更新 更多