В моей старой программе у меня есть 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:
https://bugreports.qt.io/browse/QTBUG-65592
Предлагаемый обходной путь до его исправления приведен в комментариях:
призвание
resizeDocks({nameOfAnyDock}, {40}, Qt::Horizontal)
разрешил изменение размера для работы (точное число не имеет значения). Функция вызывается сразу после вызоваaddDockWidget
,
Других решений пока нет …