Qt - QApplication是什么,简单来说?

10

我在Qt文档中看到了QApplication的描述,但理解起来不是很清晰。

你能简单地描述一下它主要的作用吗?

谢谢。

3个回答

11

关于QApplication最重要的一点是它的exec方法运行事件循环,这基本上是让插槽和信号起作用的软件组成部分。

简单来说,如果没有运行中的事件循环,由GUI组件触发的事件将根本无法传播,因此您的用户界面将不会执行任何操作。


很好的回答!您能否解释一下您所说的“...如果没有运行事件循环,GUI组件触发的事件将根本不会传播...”是什么意思?谢谢。 - Simplicity
4
一个GUI程序通常在一个循环中等待信号来工作,在完成任务后返回循环。这与控制台程序不同,控制台程序通常启动,执行其任务,然后退出。 - Kien Truong

4

简单来说

Q*Application 实例是保持 Qt 应用程序运行的核心,通过运行其主事件循环。它处理所有事件(鼠标、键盘、刷新)、信号槽、定时器以及需要某种类型的异步或事件处理 (GUI、OS 等)的绝大部分 Qt 功能。

如果没有 Q*Application,你基本上只能顺序运行 Qt 代码。我的意思是:没有 Qt 定时器,没有操作系统/用户交互。有时候这是需要的,例如在单元测试中。

主线程事件循环会在调用 Q*Application 的 exec() 方法时立即启动,并一直阻塞到应用程序退出。

选择正确的 Q*Application

根据你的应用程序类型,你将需要不同类型的类,以避免拉取不必要的依赖项:

通常,你首先创建 Q*Application,根据需要初始化应用程序的 "静态" 部分,然后调用 qApp->exec() 运行主事件循环。该函数将阻塞,直到你的应用程序关闭。

int main(int argc, char *argv[]) {
    // Q[Core|Gui|)Application
    QCoreApplication app(argc, argv);

    // Load critical settings i.e. minimal config files, GUI, etc.
    // Remember no events, timers, and signals slots will work at that stage
    QSettings settings(...);

    // Start the QApplication
    // Will return once the application closes (forced, or by user)
    return app.exec();
}

在应用程序中只应存在一个QApplication。您可以使用它的局部变量或全局指针qApp来控制它。

详细职责

按照 QApplication 类的文档:

QApplication 主要负责如下:

  • 使用用户的桌面设置初始化应用程序,例如调色板(palette())、字体(font())和双击间隔(doubleClickInterval())。如果用户全局更改了桌面设置(例如通过某种控制面板),则它会跟踪这些属性。
  • 处理事件,即接收来自底层窗口系统的事件并将其分派给相关小部件。使用 sendEvent() 和 postEvent() 您可以向小部件发送自己的事件。
  • 解析常见命令行参数并根据其设置内部状态。有关更多详细信息,请参阅下面的构造函数文档。
  • 定义应用程序的外观和感觉,其中封装在 QStyle 对象中。可以使用 setStyle() 在运行时更改此设置。
  • 指定应用程序如何分配颜色。有关详细信息,请参见 setColorSpec()。
  • 提供用户可见的字符串的本地化,通过 translate() 方法实现。
  • 提供一些神奇的对象,如 desktop() 和 clipboard()。
  • 了解应用程序的窗口。可以使用 widgetAt() 查找特定位置的小部件、获取 topLevelWidgets() 列表和 closeAllWindows() 等。
  • 管理应用程序的鼠标指针处理,参见 setOverrideCursor()

您可以重写其中之一方法 QApplication::event,从而完全控制应用程序中所有事件的处理方式。这可以通过继承它或使用 installEventFilter() 方法来完成。


1

它是非面向对象语言中存在的所有应用程序级全局状态的占位符。


1
为什么不用面向对象编程?Qt在一个面向对象的语言(C ++)中非常面向对象。 - Mat
1
@Mat:我认为你可能误读了我的回答。例如,C语言中的应用程序有很多需要维护的全局状态。QApplication取代了所有这些全局状态。 - Ignacio Vazquez-Abrams
你能简化一下你的意思吗?谢谢。 - Simplicity
1
不...真的不是这样。看一下QApplication的成员,你会意识到在C语言应用程序中,大多数成员将是全局变量或函数,而不是集中在一个对象中。 - Ignacio Vazquez-Abrams

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接