在 QMainWindow 中选择“中央小部件”的规则是什么?为什么它很重要?

Jac*_*Box 5 c++ qt qmainwindow qt5

我知道在QMainWindow实现中需要setCentralWidget,乍一看,中央小部件的含义似乎非常不言自明。但是“中央”有更严格的定义吗?

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

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

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

eyl*_*esc 7

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

在此处输入图片说明

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

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


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

您不必选择,您可以将2个QLabels作为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();
}
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

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

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

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();
}
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明