QMainWindow中选择"central widget"的规则是什么?为什么它很重要?

What is the rule for choosing "central widget" in QMainWindow? and why is it important?

我理解 setCentralWidgetQMainWindow 实现中是必需的,乍一看,中央小部件的含义似乎非常不言自明。但是“central”有更严格的定义吗?

比如说,我有几个同样重要的小部件位于 window 的中心区域,我是否应该始终找到一种方法将它们组合在一起并将该组设置为中心小部件?或者我可以随机选择一个?

更重要的是,非中心小部件会发生什么情况?中央小部件和非中央小部件之间是否存在某些可能会影响其以后行为的差异?

Qt 文档对此只字未提,只是简单地说明中央小部件很重要,这不是很有帮助。

setCentralWidget() 方法中的 central 与重要性无关,但是如果您检查具有 QMainWindow 的布局,我们将看到它在中心位置:

  • 我是否应该始终找到一种方法将它们组合在一起并将该组设置为中央小部件?或者我可以随便选择一个? centralwidget 只能有一个,所以如果你想在中心位置有多个widget,你必须创建一个新的widget 作为容器,并通过布局设置另一个widget .

  • 非中心部件会怎样?中央小部件和非中央小部件之间是否存在某些可能会影响其以后行为的差异? 没有区别。


在上面的中央小部件框中说,我相对于确切的中心点对称放置了两个 QLabel。在这种情况下,哪个 QLabel 应该是中央小部件?哪一个都可以?

可以不选,2个QLabel可以是centralWigdet的一部分,centralwidget只指居中的位置,例如:

#include <QtWidgets>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QMainWindow w;
    QLabel left_label("left");
    left_label.setAlignment(Qt::AlignCenter);
    QLabel right_label("rigth");
    right_label.setAlignment(Qt::AlignCenter);
    QWidget *central_widget = new QWidget;
    QHBoxLayout *lay = new QHBoxLayout(central_widget);
    lay->addWidget(&left_label);
    lay->addWidget(&right_label);
    w.setCentralWidget(central_widget);
    w.show();
    return a.exec();
}

如果任何一个小部件都很好,为什么 QMainWindow 如此迫切需要设置中央小部件?

不一定要设置centralwidget,但是QMainWindow不像其他widget已经有一定的布局,所以如果你想放置widgets你必须使用那个方法。

centralwidget指的是相对位置,但不完全是中心位置:

#include <QtWidgets>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QMainWindow w;
    QLabel *central_widget = new QLabel("Central Widget");
    central_widget->setAlignment(Qt::AlignCenter);
    w.setCentralWidget(central_widget);
    QDockWidget *dock = new QDockWidget("left");
    w.addDockWidget(Qt::LeftDockWidgetArea, dock);
    dock->setWidget(new QTextEdit);
    w.show();
    return a.exec();
}

通常你不需要 QMainWindow!

如果您既不需要对接也不需要 MDI,则不要使用 QMainWindow:可以使用 QWidgetQDialog

Central 表示 "in the center",如 "in the middle",而不是 "important!"。 QMainWindow's 提供停靠和多文档界面 (MDI) 功能,其中中央小部件的概念很有用。只能有一个中央小部件,因此 "which of many" 应该成为中央小部件没有实际意义:您不能有一个以上。 Qt 对象设计的基本方面之一是 QObject 是其他对象的容器,QWidget 也是如此:它是一个 canvas,您可以在上面放置其他小部件。因此,如果您绝对需要停靠 and/or MDI,那么中央小部件将是您放置其他非停靠小部件的任何 QWidget。就这些了。