5

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

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

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

非常感谢

4

3 回答 3

5

一个准备充分的项目会将应用程序逻辑与 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,在这种情况下,这样做会更难。在这种情况下,您将不得不手动完成所有操作。

于 2013-04-14T21:14:29.700 回答
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 文件。

于 2013-04-14T21:14:51.857 回答
0

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

但答案是肯定的。

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

Marc Mutz-mmutz他的回答表示赞赏。

于 2020-04-03T04:42:46.573 回答