Qt

QWidgetQMainWindow 是 Qt 框架中的两个重要类,它们都用于创建图形用户界面(GUI),但有一些关键的区别:

QWidget

  • 基础类: QWidget 是 Qt 中所有用户界面对象的基类。它提供了一个基础的窗口部件,其他窗口部件(如按钮、文本框)都是从 QWidget 继承而来的。
  • 功能: QWidget 本身是一个通用的窗口部件,没有特别的窗口管理功能。它可以作为窗口的基础组件,也可以作为其他复杂组件的容器。
  • 布局管理: QWidget 提供了布局管理功能,可以使用布局管理器来控制其子部件的位置和大小。
  • 使用场景: 你可以将 QWidget 用作对话框、工具条、或是任何其他需要的窗口部件。如果你只需要一个简单的窗口,QWidget 是一个合适的选择。

QMainWindow

  • 派生类: QMainWindowQWidget 的子类,提供了更丰富的窗口功能和特性。
  • 功能: QMainWindow 是设计用于主窗口的类,它提供了菜单栏、工具栏、状态栏和中央窗口区域的支持。这使得它特别适合用于主应用窗口的设计。
  • 布局管理: QMainWindow 提供了特定的布局区域,如菜单栏、工具栏、状态栏和中央部件区域。你可以使用这些功能来创建更复杂的应用程序界面。
  • 使用场景: 当你需要一个具有菜单栏、工具栏和状态栏的主窗口时,QMainWindow 是一个理想的选择。它适合用于具有复杂界面的桌面应用程序。

主要区别总结

  1. 功能扩展:
    • QWidget: 基础窗口部件,功能较少,适合用于创建简单的窗口或部件。
    • QMainWindow: 提供额外的功能,如菜单栏、工具栏和状态栏,适合用于主应用窗口。
  2. 使用场景:
    • QWidget: 适合用作对话框、工具条、或简单的窗口部件。
    • QMainWindow: 适合用于需要复杂用户界面的主窗口。
  3. 布局支持:
    • QWidget: 你需要手动设置布局。
    • QMainWindow: 提供了内置的菜单栏、工具栏、状态栏和中央部件区域,可以直接使用这些功能来设计主窗口界面。

connect(menu, &QMenu::triggered, this, &Widget::onMenuTriggered); 为什么QMenu* menu;时不报错 当QMenu menu;时报错:No matching member function for call to ‘connect’

在 Qt 中,connect 函数的作用是将一个信号与一个槽函数连接起来。它依赖于信号发射的对象和槽函数的对象都是有效的,并且能够正确识别和匹配。

使用 QMenu* menu

cpp
QMenu* menu = new QMenu();
connect(menu, &QMenu::triggered, this, &Widget::onMenuTriggered);
  • 这里,menu 是一个指向 QMenu 对象的指针。
  • connect 函数可以使用 menu 指针来连接信号和槽,因为 QMenu 对象在堆上分配,并且其生命周期由指针管理。
  • QMenu 的实例通过指针能够正确地传递给 connect,并且 QMenu 的成员函数和信号可以被正确识别。

使用 QMenu menu

cpp
QMenu menu;
connect(menu, &QMenu::triggered, this, &Widget::onMenuTriggered);
  • 这里,menu 是一个栈上的 QMenu 对象。
  • 栈上的对象在 connect 时会导致问题,因为 connect 期望信号发射对象在其生命周期内有效。栈上的对象会在超出作用域时被销毁。
  • 在这个情况下,menu 可能在连接信号和槽时已经过早销毁,导致 connect 函数找不到有效的信号源。

总结

  • QMenu* menu:指针允许动态管理对象的生命周期,connect 可以正常工作。
  • QMenu menu:栈上的对象在超出作用域时可能被销毁,导致 connect 函数不能正确地处理信号和槽。

因此,使用指针确保 QMenu 对象在 connect 调用期间有效。

image-20240823104744847

image-20240823104804653

定义对象的指针,让widght来管理对象的生命周期,要是直接定义对象,可能不知道什么时候对象就被销毁了,有些用到这些对象的函数就可能报错,因为在栈上找不到他了