Если пользователь не изменил размер виджета закрепления, все в порядке, и изменение центрального виджета не повлияло на размер виджета закрепления (который остается в размере намекать). Однако когда пользователь изменяет размер виджета закрепления, он ненормально увеличивается и занимает центральное место для виджета.
Вот анимированный gif-изображение проблемы:

И вот код для воспроизвести проблему (с Qt5.15) :
Код: Выделить всё
#include
#include
#include
#include
#include
#include
#include
class Widget : public QWidget
{
public:
Widget(const QString& aName, QSize aSize, QWidget * parent = nullptr)
: QWidget(parent), size(aSize)
{
static int COUNT = 0;
static QStringList COLORS = { "LightBlue", "LightGreen", "LightSalmon" };
auto label = new QLabel(tr("%1 (%2x%3)").arg(aName).arg(size.width()).arg(size.height()), this);
label->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
label->setAlignment(Qt::AlignCenter);
label->setWordWrap(true);
label->setStyleSheet(QString("QLabel { background-color: %1 }").arg(COLORS.value(COUNT++ % COLORS.size())));
auto mainLayout = new QVBoxLayout(this);
mainLayout->addWidget(label);
}
QSize sizeHint() const override
{
return size;
}
private:
QSize size;
};
class MainWindow : public QMainWindow
{
public:
MainWindow(QWidget *parent = nullptr) : QMainWindow(parent)
{
// Creating toolbar
addToolBar("Tool bar")->addAction("Switch central Widget", this, &MainWindow::switchCentralWidget);
// Creating main widget
switchCentralWidget();
// Creating dock widget
auto dockWidget = new QDockWidget("My dock widget");
dockWidget->setWidget(new Widget("DOCK WIDGET", {200, 400}, this));
addDockWidget(Qt::RightDockWidgetArea, dockWidget);
}
private slots:
void switchCentralWidget()
{
setCentralWidget(new Widget("CENTRAL WIDGET", {300, 400}, this));
}
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
Единственное, что я нашел для предотвращения увеличения док-станции, — это установить временный максимальный размер. (см. ниже).
Код: Выделить всё
void switchCentralWidget()
{
// Dirty hack
for (auto dock : findChildren()) {
int width = dock->widget()->width();
int maxWidth = dock->widget()->maximumWidth();
dock->setMaximumWidth(width);
QTimer::singleShot(1000, dock, [=] { dock->setMaximumWidth(maxWidth); });
}
setCentralWidget(new Widget("CENTRAL WIDGET", {300, 400}, this));
}
p>
Мне бы хотелось, чтобы виджет закрепления сохранял тот же размер, что и до переключения центрального виджета.
Подробнее здесь: https://stackoverflow.com/questions/792 ... ral-widget