我理解在QMainWindow实现中需要setCentralWidget,乍一看,它似乎非常自我解释中央小部件的含义。但对“中央”有更严格的定义吗?
说,我在窗口的中心区域有几个同样重要的小部件,我应该总是找到一种方法将它们组合在一起并将组设置为中央小部件吗?或者我可以随意选择一个?
更重要的是,非中心小部件会发生什么?中央和非中央小部件之间是否存在某些可能会影响其行为的差异?
Qt文档没有说明这一点,除了简单地说明中央窗口小部件很重要,这不是很有用。
setCentralWidget()
方法中的中心词与重要性无关,但是如果你检查具有QMainWindow的布局,我们将看到它处于中心位置:
在上面的中央小部件框中,我相对于确切的中心点对称放置两个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已经具有某种布局,因此如果要放置窗口小部件,则必须使用该方法。
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
:QWidget
或QDialog
会改为。
中心意味着“在中心”,如“在中间”,而不是“重要!”。 QMainWindow
提供了对接和多文档界面(MDI)功能,中央小部件的概念很有用。只能有一个中央窗口小部件,因此“应该将其中的哪一个”设置为中心是没有实际意义的:你不能有多个。 Qt对象设计的一个基本方面是QObject
是其他对象的容器,QWidget
也是如此:它是一个可以放置其他小部件的画布。因此,如果您绝对需要对接和/或MDI,那么中央小部件将是您放置其他非对接小部件的任何QWidget
。那就是全部。