【问题标题】:Qt Application "within" applicationQt 应用程序“内部”应用程序
【发布时间】:2012-07-25 20:32:06
【问题描述】:

Qt 4.8.2,windows 7 x64(但我应该将其视为通用实现,而不是依赖于操作系统 - 如果可能的话 -)

这是一个概念问题,也是关于实施的问题。

我有一个(非常)简单的 QApplication。它读取带有“按钮”标签的 XML,为每个“按钮”添加一个新的 QPushButton 到布局中。这允许我根据配置文件(XML)动态生成 gui。我的问题是把它带到“下一个层次”。

我想开始将这些按钮与其他模块(例如:QDialog)相关联,然后它们会做他们必须做的任何事情。

我的最终目标是拥有一个“读取配置文件”(xml) 的应用程序,并根据其信息生成与读取的模块一样多的按钮。之后,“连接”按钮“启动命令”(我现在没有更好的措辞),它将作为普通模块运行......直到您关闭它,然后您将返回菜单。

我基本上想要一个动态生成的菜单(通过读取 XML 文件),然后连接这些按钮以执行/启动我的模块。我还希望它灵活,所以如果明天我在我的 XML 中添加一个新模块并将该模块添加到 app 文件夹中,我希望它能够启动它。

我的问题是:

  1. 我说得够清楚吗?

  2. 游戏通常如何执行进程?例如;来自视频游戏(在大多数 AAA 中)的“菜单”通常是用动作脚本或类似的东西制作的,然后,当您选择“新游戏”或“加载游戏”等时,它会执行某些其他 模块 em>(因为没有更好的词了),尤其是在 New Game 按钮和加载 DirectX 应用程序之间的过渡。

  3. 如何开发此类项目?我应该在一个通用解决方案中创建多个项目吗?

如您所见,我对软件设计知之甚少,因此,如果您认为我的问题过于基础,并且您建议我愿意阅读有关该主题的书,我承认我有点迷茫,欢迎提出任何建议。

与往常一样,如果我不够清楚或者我可以扩展某些内容,请告诉我。感谢您在此主题上提供的各种帮助。

另外:如果有人认为我应该更改当前标签,请告诉我。我认为这些是最合适的。

【问题讨论】:

  • "内部流程" 为什么需要是内部流程?将其作为常规进程运行并等待它完成不是更容易吗?
  • 您能详细说明一下吗?实际上,我不知道它是否会(或不会),因此我为什么要问。我说“内部流程”是因为我真诚地认为这意味着它将是“来自应用程序的模块”,而不是从我的主应用程序执行的独立应用程序。
  • 这是我的问题:将其作为独立应用程序运行有什么问题?人们总是这样做:为常用工具编写小的启动程序。
  • 嗯,我唯一的“要求”是人们不能只进入文件夹并执行那些独立游戏。我希望他们“不得不”使用菜单。
  • 为什么从菜单运行它很重要?您正在为自己做很多工作,因为它的基础非常简单:应用启动器。

标签: c++ qt coding-style


【解决方案1】:

您可能不需要将其可视化为“应用程序中的应用程序”。当你分解它时,它实际上是一个可以启动进程的应用程序,并且通过 xml 文件进行配置。

之后,将按钮“连接”到 DLL?其他 .exe 文件?哪一个 将作为普通应用程序运行。

当您说连接到 DLL 时,我不确定您具体是什么意思……但这真正需要做的就是从您的应用程序启动一个子进程。如果我单击按钮 A,那么它可以在 QProcess 中启动应用程序 A。您的应用程序是父进程,并且知道它何时停止运行。

如果您提到 DLL 的意思是您想开发其他单独编译的小部件,并且能够通过单击按钮动态加载它们,那么我认为它仍然不是另一个应用程序。您一次只能运行一个 QApplication。如果您导入包含小部件的新模块,它们可以显示在相同的现有事件循环下运行。

【讨论】:

  • >当你分解它时,它实际上是一个可以启动进程的应用程序,并通过 xml 文件进行配置。你确定吗?我的意思是,现在我看到我的描述可能不正确,但我不明白 > 如果您在提到 DLL 时的意思是您想要开发其他单独编译的小部件并能够从按钮单击 是的,我的意思是正是。我现在正在阅读 QProcess 文档。 QProcess 不是用来执行“外部”应用程序的吗? (即 Firefox、Calc、Notepad 等)如果是这种情况,开销不会很大。
  • 那么是的,我认为您的问题中的描述不清楚,因为您提到了.exe,这使我相信您想要启动应用程序。是的 QProcess 用于启动外部进程。不,它不会有太多开销,因为它是一个单独的进程,除了启动它之外,您并没有真正与它进行通信。至于在外部库中创建小部件,真的没有什么能阻止你加载它们并在同一个 QApplication 中运行它们。
  • 好的,我将编辑我原来的问题。我这样说是因为我不知道如何正确地指代我想做的事情。您将如何在外部库中加载小部件?请记住,我不知道这些东西是如何被调用的(就像在类名中一样),因为我希望它们是动态生成的。我想我也会添加这个例子;我有一个主应用程序,它是一个菜单。我希望它启动我将制作的不同游戏(全部作为一个包,而不是独立的应用程序)并根据我安装的游戏生成所述菜单。
  • 嗯,我对为这些游戏即时编译逻辑代码知之甚少,但这听起来更像是您只想做 Qt Designer 已经做的事情。它会生成您在 XML 中设计的 UI,然后 uic 可以将其加载到实际的小部件对象中。
【解决方案2】:

游戏通常如何执行进程?例如;来自视频游戏(在大多数 AAA 中)的“菜单”通常是用动作脚本或类似的东西制作的,然后,当您选择“新游戏”或“加载游戏”等时,它会执行某些其他模块(因为缺少更好的词),尤其是新游戏按钮和加载 DirectX 应用程序之间的过渡。

这是不正确的。

“大多数 AAA”是单个应用程序。他们是否使用动作脚本或任何特定的脚本语言来构建他们的 GUI 是无关紧要的。游戏通常是单个应用程序;你在游戏中总是。它总是有 DirectX 或 OpenGL 或任何运行,无论您是在玩游戏还是坐在菜单屏幕上。当您开始游戏时,所发生的只是游戏在应用程序中运行一系列函数。

它们不一定排列在“模块”或外部世界可以访问甚至知道的其他结构中。它们通常不会“加载”其他代码;它只是调用应用程序中的其他函数。

它的核心与命令行应用程序没有什么不同,它等待用户输入一些输入,然后对该输入执行一些操作。

“大多数 AAA”游戏不能按照您的要求进行。您不能只是将某些内容添加到 XML 文件中,然后让它们在当前游戏加载另一个游戏。他们不是那样建造的,这不是他们的目的。

如果您想要一个灵活的菜单应用程序来启动其他游戏,那么每个游戏都必须是一个单独的应用程序,并且菜单应用程序应该与所有游戏分开。在这一点上,启动游戏只是启动一个过程。这就是 Steam 和类似工具的工作原理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-28
    • 2011-09-07
    • 1970-01-01
    • 1970-01-01
    • 2011-07-08
    • 1970-01-01
    • 2013-07-22
    • 1970-01-01
    相关资源
    最近更新 更多