Запретить QMainWindow увеличивать QDockWidget при переключении центрального виджетаC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Запретить QMainWindow увеличивать QDockWidget при переключении центрального виджета

Сообщение Anonymous »

У меня есть главное окно с закрепленным виджетом и центральным виджетом. Центральный виджет может быть изменен в зависимости от выбора пользователя, но виджет закрепления остается.
Если пользователь не изменил размер виджета закрепления, все в порядке, и изменение центрального виджета не повлияло на размер виджета закрепления (который остается в размере намекать). Однако когда пользователь изменяет размер виджета закрепления, он ненормально увеличивается и занимает центральное место для виджета.
Вот анимированный 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»