Сплиттер QDockWidget переходит при изменении размера QMainWindow

В моей старой программе у меня есть QTableWidget с двумя столбцами внутри QDockWidget.

Строя его в наше время (Qt 5.10), мне кажется, переопределить sizeHint таблицы () чтобы получить ширину помимо 100 пикселей или что-то. Что было немного раздражает (раньше это не требовалось — почему ширина таблицы через заголовки не используется по умолчанию?)

Но с этим изменением теперь есть другая неприятность: если пользователь делает какое-либо перемещение сплиттера для виджета дока, он будет потерян при любом изменении размера окна. Я сделал немного MCVE, чтобы показать эффект … вот ситуация запуска:

ситуация при запуске

Тогда, скажем, пользователь немного перетаскивает сплиттер (может быть расширение, может быть сжатие — не имеет значения):

пользователь перемещает сплиттер

Теперь они немного опускают нижний край окна, и щелчок, он возвращается к предпочтительному размеру (внезапный скачок происходит сразу же, когда мышь начинает перетаскивать):

после изменения размера окна

Изменение политики горизонтального размера с QSizePolicy::Preferred в QSizePolicy::Ignored не влияет на это поведение, не звонит setStretchLastSection() похоже тоже не помогает.

Я бы предпочел, чтобы размер окна был изменен по вертикали, чтобы горизонтальный разделитель не двигался вообще … и если он изменен по горизонтали, чтобы было сделано что-то более постепенное, чем прыжок. Есть идеи? У Qt Creator, похоже, нет этой проблемы с его списком наблюдения, но я недостаточно знаком с источником, чтобы разобраться, почему.

mainwindow.h:

#include <QMainWindow>

QT_BEGIN_NAMESPACE
class QTextEdit;
class SizedTableWidget;
QT_END_NAMESPACE

class SizedTableWidget;

class MainWindow : public QMainWindow {
Q_OBJECT

QTextEdit *textEdit;
SizedTableWidget *table;

public:
MainWindow ();
};

mainwindow.cpp:

#include <QtWidgets>

#include "mainwindow.h"
class SizedTableWidget : public QTableWidget {
public:
SizedTableWidget (int rows, int columns, QWidget *parent) :
QTableWidget (rows, columns, parent) {}

QSize sizeHint() const {
return QSize (
verticalHeader()->width()
+ horizontalHeader()->length()
+ frameWidth() * 2,
horizontalHeader()->height()
+ verticalHeader()->length()
+ frameWidth() * 2
);
}
};

MainWindow::MainWindow() : textEdit(new QTextEdit) {
setCentralWidget(textEdit);

QDockWidget *dock = new QDockWidget(tr("Table"), this);
dock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);

table = new SizedTableWidget (1 /* rows */, 2 /* cols */, dock);
table->setHorizontalHeaderLabels(QStringList() << "name" << "value");

QTableWidgetItem *nameItem = new QTableWidgetItem;
nameItem->setText("foo");
table->setItem(0, 0, nameItem);

QTableWidgetItem *valueItem = new QTableWidgetItem;
valueItem->setText("10");
table->setItem(0, 1, valueItem);

table->horizontalHeader()->setStretchLastSection(true);
table->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding);

dock->setWidget(table);
addDockWidget(Qt::RightDockWidgetArea, dock);
}

Постскриптум если кто-нибудь знает, почему в заголовках столбцов и строк в Windows нет стилей, мне было бы интересно узнать … это специально? Отлично смотрится на Linux.

Системная информация:

  • Qt 5.10.0
  • Qt Creator 4.5.0
  • Windows 10 Home, 1709 (Сборка 16299,125) и MSVC 2017
  • Kubuntu Linux 17.10 и gcc 7.2.0

1

Решение

Похоже, это ошибка — теперь подтвержденная несколькими сторонами — которая появилась в Qt 5.10:

https://bugreports.qt.io/browse/QTBUG-65592

Предлагаемый обходной путь до его исправления приведен в комментариях:

призвание resizeDocks({nameOfAnyDock}, {40}, Qt::Horizontal) разрешил изменение размера для работы (точное число не имеет значения). Функция вызывается сразу после вызова addDockWidget,

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]