【问题标题】:Qt generate .ui file from old c++ project?Qt 从旧的 c++ 项目生成 .ui 文件?
【发布时间】:2020-04-03 12:42:46
【问题描述】:

我是 Qt 新手,但对 C++ 有很好的掌握。我刚刚学习了 qt design (QT5) 来生成 GUI 和 .ui 文件,并在 VS 2012 中进行编码。

现在有一个纯手工编写的旧项目,没有 qt 设计。为了维护它,代码仍然需要手工编写。

是否有任何 qt 工具可以对代码进行逆向工程以产生 qt design 可以处理的东西?那么未来的任何 GUI 修改都可以在 qt 设计中进行吗?

非常感谢

【问题讨论】:

  • 除了手写,怎么写代码?
  • @user1095108 问题上下文使含义相当明显。 UI 代码就是这里的意思。
  • 似乎没有这样的工具可用,虽然我希望有。我保留了一个小 ui 文件的存储库,这些文件代表在设计器中创建的不同类型的 UI 对象 - 选项卡控件、按钮框控件等。然后,当我想在现有代码中使用一个时,我在设计器,根据我的需要进行修改,在设计器中生成 C++,然后将其放入我的应用程序 - 这需要一些编辑和按摩, - 你必须知道 Qt C++ GUI 代码是如何工作的,但通常工作得很好,而且比从头开始编写整个 GUI 组件更容易!

标签: c++ qt


【解决方案1】:

一个准备充分的项目会将应用程序逻辑与 UI 层隔离开来,从而更容易对后者进行更改或完全替换。如果你要转换的项目是这样的,在某种程度上应该是可行的。

如果您保持相同的命名,您的命令式 UI 和您的 .ui 生成的 UI 之间最显着的区别将是当您访问 UI 成员时额外的 ui->

没有工具可以为您完成所有工作,但您可以使用 QObject::dumpObjectTree() 获得 UI 的树状表示,如下所示:

QTabDialog::dialog <574,451,133,123>
      QBoxLayout::unnamed
        QBoxLayout::unnamed
        QBoxLayout::unnamed
      QPushButton::ok <45,91,82,26>
      QTabWidget::tab widget <6,6,119,75>
        QTabBar::tab control <0,0,48,24>
          QToolButton::qt_right_btn I
          QToolButton::qt_left_btn I
          QAccel::tab accelerators
        QWidget::tab base I
        QWidgetStack::tab pages <0,22,119,51>
          QFrame::first <2,2,115,47>
          QObject::unnamed
          QWidgetStackPrivate::Invisible::unnamed <2,2,115,47>

如您所见,您可以轻松解析并获取当前 UI 中每个对象的类型和名称,您可以使用该信息以及元系统提供的功能来查询属性并生成 XML .ui 文件。

当然,您可以使用动态创建或删除元素的更动态的 UI,在这种情况下,这样做会更难。在这种情况下,您将不得不手动完成所有操作。

【讨论】:

    【解决方案2】:

    简短回答:不。

    嗯,可能有,但至少我不知道有任何工具可以采用 C++ GUI 并从中生成 .ui 文件。如果存在这样的东西,它很可能不会解析 C++ 代码,而是需要以某种方式附加到正在运行的应用程序,然后从中解析 GUI。据我所知,这实际上并不难实现,这要归功于 Qt 元对象和属性系统允许反射,但我不知道这样的工具,我怀疑它是否存在。有 GUI 测试工具可以执行此操作,但它们不会根据从正在运行的应用程序收集的数据生成 .ui 文件。

    然而,手工编写 Qt GUI 是完全合理的,而且通常也更易于维护(只要维护者精通 Qt 风格的 C++ 和 QWidgets)。

    另外,如果您需要向 GUI 添加新的小部件(或从根本上修改现有的小部件,以便从头开始重写是合理的),那么使用 Qt Designer 实现这些小部件(独立版本或一个集成到 Qt Creator IDE 中,并且不能与 QML Designer 混合,即使它们在 Qt Creator 中的相同图标后面)。根据我的观点和经验,通常最好使用 Designer 设计单个小部件(例如,QTabWidget 中的页面或对话框),但不要将整个 UI 作为一个大的 .ui 文件。

    【讨论】:

      【解决方案3】:

      我同意 @hyde 的观点。实施这样的工具是不值得的。使用 Qt Designer 制作布局非常快。

      但答案是肯定的。

      软件自省工具GammaRay 可以将正在运行的Qt 应用程序中的小部件保存到.ui 文件中(我相信从2012 年开始)。在 Qt 5.12 上测试 - 布局完全正确,但没有信号,没有对象名称,尽管它为恢复对象的层次结构及其属性提供了一个很好的起点。

      感谢Marc Mutz - mmutzhis answer

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-23
        • 2014-08-26
        • 2017-02-04
        • 1970-01-01
        • 2016-02-04
        相关资源
        最近更新 更多