Каково правило выбора «центрального виджета» в QMainWindow?и почему это важно? - PullRequest
0 голосов
/ 18 февраля 2019

Я понимаю, setCentralWidget требуется в реализации QMainWindow , и, на первый взгляд, казалось, что само центральное представление виджета очень самоочевидно.Но есть ли более строгое определение " central "?

Скажем, у меня есть несколько одинаково важных виджетов, расположенных в центральной части окна, если я всегда найду способ сгруппировать ихвместе и установить группу в качестве центрального виджета?или я мог бы просто случайно выбрать один?

Что еще более важно, что происходит с нецентральными виджетами?Существуют ли определенные различия между центральными и нецентральными виджетами, которые могут позже повлиять на их поведение?

В документации Qt об этом ничего не сказано, кроме простого указания центрального виджета, что не очень полезно.

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

Обычно вам не нужно QMainWindow!

Если вам не нужна стыковка или MDI, не используйте QMainWindow: QWidget илиQDialog будет делать вместо этого.

Центральное означает «в центре», как в «в середине», а не как «важно!».QMainWindow обеспечивает стыковку и функциональность интерфейса с несколькими документами (MDI), и здесь полезно понятие центрального виджета.Центральный виджет может быть только один, поэтому «какой из многих» следует сделать центральным, это спорный вопрос: у вас не может быть больше одного.Одним из фундаментальных аспектов проектирования объектов Qt является то, что QObject является контейнером других объектов, как и QWidget: это холст, на котором вы можете разместить другие виджеты.Таким образом, если вам абсолютно необходимы док-станция и / или MDI, тогда центральным виджетом будет любой QWidget, в который вы поместите другие не-док-виджеты.Вот и все.

0 голосов
/ 18 февраля 2019

Слово central в методе setCentralWidget() не имеет ничего общего с важностью, но если вы проверите макет, имеющий QMainWindow, мы увидим, что он находится в центральной позиции:

enter image description here

  • Должен ли я всегда найти способ сгруппировать их и установить группу в качестве центрального виджета?Или я мог бы просто случайно выбрать один? Может быть только один центральный виджет, поэтому, если вы хотите иметь несколько виджетов в центральной позиции, вы должны создать новый виджет, который является контейнером, и установить другой виджет через макеты.

  • что происходит с нецентральными виджетами?Существуют ли определенные различия между центральными и нецентральными виджетами, которые могут повлиять на их поведение позже? Нет никакой разницы.


Скажите в окне центрального виджета вышеЯ размещаю два QLabels симметрично относительно точной центральной точки.В этом случае какой 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();
}

enter image description here

Если любой виджет в порядке, почему настройка центрального виджета так критично требуется 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();
}

enter image description here

...