gpt4 book ai didi

qt - Qt 中的哪些特性或概念让你感到厌烦?

转载 作者:行者123 更新时间:2023-12-03 13:42:26 25 4
gpt4 key购买 nike

关闭。这个问题是opinion-based .它目前不接受答案。












想改进这个问题?更新问题,以便 editing this post 可以用事实和引用来回答它.

8年前关闭。




Improve this question




Qt是一个很好的框架和很棒的 UI 工具包,它有 many useful features and concepts .我们大多数人可能同意Trolltech , 最近 Nokia ,在开发它方面做得很好。 Qt 的最新进展之一是 QML ,我觉得这是令人着迷的进步。

但是,我发现一些概念设计或实现不当,例如 Model/View (概念很好,但实现不是)Phonon 也是如此媒体框架。有人说是meta-object让他们发疯的概念。

所有这些显然或多或少都是主观的,但是 Qt 在 Qt 中使用哪些功能或概念让您觉得烦人或繁重?以及如何绕过它们?

最佳答案

我对 Qt 的大部分提示来自于 API 没有完全接受 QObject 提供的动态性这一事实。如果你敢于创建一个元对象编译器来为 C++ 添加动态行为,那么为什么要害羞呢?

我在下面列出的所有东西都是我的团队在某个时候需要的东西,我们必须自己编写代码。这很有趣,我们学到了很多关于 Qt 内部的知识,但我不介意它是否已经完成并准备好使用。

无分布式 QObject

你知道,就像在 cocoa 一样。他们在 QtDBus 上走了一半——剩下要做的就是网络。我们必须为此实现自己的解决方案,而且由于我们生活在 Qt 代码之外,我们无法更改内部结构来实现所有不错的功能。

没有用于数据存储的 API

当然,每个人都会编写自己的不完整 QObject-to-SQLite 库。不过,QDataStream 是一个非常好的开始。

无数据绑定(bind)

好吧,Qt Quick 有数据绑定(bind),但数据绑定(bind)应该存在于 QtCore 中。有了良好的数据绑定(bind),编写表示 QObject 集合的 QAbstractItemModel 应该成为过去:QObjectListModel 应该是你所需要的。

(是的,QDataWidgetMapper 是个笑话。)

QObjects 没有自动撤消管理

我们的模型类通常是 QObjects 并且 Q_PROPERTY 有一个可选的 NOTIFY 信号,这正是实现自动撤消所需要的。它很容易做到,它应该已经成为 Qt 的一部分。 (然而,它需要一些哈希。)

没有收藏属性

并非所有属性(property)生来都是平等的。其中一些是收藏品。能够以抽象的方式处理这些绝对是一件好事。

半生不熟的 QMetaStuff API

我只是讨厌这个 API,因为我喜欢它。例如,不能:

  • 动态构建 QMetaObjects 并替换它们;
  • 使用 QVariants 作为参数调用元方法;
  • 按返回类型、名称或参数类型查询方法;
  • 使用各自的 QMetaMethods (at least not until 4.8) 连接信号和槽;
  • 例如,以与拦截事件相同的方式拦截属性设置/获取。

  • 几乎所有这些都可以轻松解决。 #2的解决方案:
    QVariant call(QObject* object, QMetaMethod metaMethod, QVariantList args)
    {
    QList<QGenericArgument> arguments;

    for (int i = 0; i < args.size(); i++) {

    // Notice that we have to take a reference to the argument. A
    // const_cast is needed because calling data() would detach
    // the QVariant.

    QVariant& argument = args[i];

    QGenericArgument genericArgument(
    QMetaType::typeName(argument.userType()),
    const_cast<void*>(argument.constData())
    );

    arguments << genericArgument;
    }

    QVariant returnValue(QMetaType::type(metaMethod.typeName()),
    static_cast<void*>(NULL));

    QGenericReturnArgument returnArgument(
    metaMethod.typeName(),
    const_cast<void*>(returnValue.constData())
    );

    // Perform the call

    bool ok = metaMethod.invoke(
    object,
    Qt::AutoConnection, // In case the object is in another thread.
    returnArgument,
    arguments.value(0),
    arguments.value(1),
    arguments.value(2),
    arguments.value(3),
    arguments.value(4),
    arguments.value(5),
    arguments.value(6),
    arguments.value(7),
    arguments.value(8),
    arguments.value(9)
    );

    if (!ok) {
    // Handle the error...
    } else {
    return returnValue;
    }
    }

    有用的功能可能会被删除

    在 qt-interest 中有谈论 DOM , style sheets , 和 custom file engines将在 future 的 Qt 版本中删除。

    Phonon 没有跨平台后端

    除了不能一直工作之外,Phonon 没有稳定的后端,可以在三个最常见的平台上工作:Windows、Linux 和 Mac OS X。有一个 VLC 后端,但它肯定不稳定,它的许可不清楚而且,VLC 对 Mac 的支持是“ resting on shaky ground”。当然,责任完全在于 Linux。多媒体支持有 never been one of its strengths .它缺少诸如 Quicktime 或 DirectStuff 之类的东西。

    没有加密类

    有 QCryptographicHash 和 QSSLSocket (及其 funny error modes ),仅此而已。幸运的是,有两个很好的库可以填补这个空白: BotanQCA . QCA 基于 Qt,但是从 Java 加密类中复制了它的 API,所以不是很好。 Botan 有一个漂亮的界面并且(但是?)是“纯”C++。仍然缺少 Qt 风格的加密库。

    关于qt - Qt 中的哪些特性或概念让你感到厌烦?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3664750/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com