在QMainWindow中选择“中心窗口部件”的规则是什么?为什么这很重要?

9
我了解setCentralWidgetQMainWindow实现中是必需的,乍一看,似乎非常自我解释什么是中央小部件。但是,“中央”是否有更严格的定义呢?
比如说,如果我有几个同等重要的小部件位于窗口的中央区域,我应该总是找到一种方法将它们分组并将该组设置为中央小部件吗?还是可以随机选择一个?
更重要的是,非中央小部件会发生什么?中央和非中央小部件之间是否存在某些差异,可能会影响它们以后的行为?
Qt文档除了简单地说明中央小部件很重要之外,没有提供任何关于这方面的信息,这并不是很有帮助。
2个回答

13

setCentralWidget()方法中的central一词并不代表重要性,但如果您查看具有QMainWindow的布局,将看到它位于中央位置:

enter image description here

  • 我是否应该总是找到一种方式将它们分组并将该组设置为中心窗口小部件?或者我可以随意选择其中一个?只能有一个centralwidget,因此,如果您想在中央位置放置多个小部件,则必须创建一个新的小部件作为容器,并通过布局设置其他小部件。

  • 非中心小部件会发生什么?中心和非中心小部件之间是否存在某些差异,可能会影响它们以后的行为?没有区别。


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

您不需要选择,您可以让这两个QLabel成为centralWidget的一部分,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如此重要?

你不一定需要设置一个中央小部件,但是与其他小部件不同,QMainWindow已经有了特定的布局,如果你想放置小部件,就必须使用那种方法。

中央小部件是相对位置,但不完全是中心位置:

#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();
}

在此输入图片描述


感谢您指出这与重要性无关。但这并没有完全消除我的困惑。比如在您上面的中心窗口小部件框中,我对称地放置了两个QLabel,以确切的中心点为对称轴。在这种情况下,哪个QLabel应该是中心小部件?任何一个都可以吗?如果任何一个小部件都可以,为什么设置中心小部件对于QMainWindow如此至关重要? - JackOuttaBox
1
@JackOuttaBox,你不能“在精确的中心点对称地放置两个QLabel”。中心窗口是一个小部件 - 单数形式。如果你想要两个标签并排放置,你需要将它们放在同一个父窗口的布局中,并将窗口设置为中心窗口。 - G.M.
@JackOuttaBox,正如G.M.所指出的那样,它并不完全是指小部件的中心,而是在其他组件(如Dock Widgets、Menubar、ToolBar、StatusBar)的中心。 - eyllanesc

1
通常情况下,您不需要使用QMainWindow!如果您不需要停靠或MDI,则不要使用QMainWindow:可以使用QWidget或QDialog代替。中央意味着“在中心”,就像“在中间”一样,而不是“重要!”QMainWindow提供了停靠和多文档界面(MDI)功能,因此中央窗口小部件的概念非常有用。只能有一个中央窗口小部件,因此将“众多”中的哪一个设置为中央是无意义的:您不能拥有多个中央窗口小部件。Qt对象设计的基本方面之一是QObject是其他对象的容器,QWidget也是如此:它是一个可以放置其他小部件的画布。因此,如果您绝对需要停靠和/或MDI,则中央窗口小部件将是任何放置其他非停靠小部件的QWidget。就这些。

1
QMainWindow不提供MDI功能,QMdiArea提供此功能。 - musicamante

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