Размер виджета Qt изменяется до ширины = 256, хотя он не должен

Настройка формы:

QSplitter (выделено на изображении), который содержит QTreeWidget (слева) и QTableWidget (справа):

Нестандартные свойства этих двух виджетов в QSplitter:

  • QTreeWidget

    минимальный размер/ширина = 150

  • QTableWidget

    минимальный размер/ширина = 300
    sizePolicy/горизонтальное растяжение = 1

По сути, приведенная выше установка определяет минимальную ширину этих двух компонентов, и именно QTableWidget будет изменять свою ширину при изменении размера формы.
Кнопки с правой стороны размещены в QVBoxLayout, а его размер фиксирован.

Вопрос:

При изменении размера формы ширина QTreeWidget увеличивается от минимума 150 до неизвестных 256, и только затем QTableWidget начинает расти, в то время как я ожидаю, что QTreeWidget вообще не увеличится в ширину, так как QTableWidget - это тот, у которого Horizontal Stretch установлен на 1.

Обратите внимание, это не имеет ничего общего с QSplitter, так как то же самое происходит, когда я вместо этого помещаю эти два виджета в QHBoxLayout.


ОБНОВЛЕНИЕ:

Установка QTreeWidget maxSize/Width на 150 (такая же, как и MinimumSize/Width), чтобы избежать изменения размера этого виджета, дает следующее:

QTreeWidget теперь исправлено на 150, но при изменении размера окна между двумя виджетами остается пустой промежуток. Этот разрыв увеличивается до 256-150=106, а затем QTableWidget начинает увеличиваться.
В основном результат аналогичен, но этот временной интервал, который был занят QTreeWidget, теперь отведен этому пустому интервалу.

Я начал чувствовать, что это может быть ошибка Qt.

Техническая информация:

  • Ubuntu 10.04 (Ясная Рысь) x86_64
  • ССЗ 4.4.3
  • Qt 4.6.2

person Andrejs Cainikovs    schedule 17.12.2011    source источник
comment
И что такое QSizePolicy::Policy для этих виджетов? Что произойдет, если вы установите QSizePolicy::Expanding вместо QTableWidget?   -  person Lol4t0    schedule 17.12.2011
comment
QSizePolicy используется по умолчанию для обоих виджетов, которые расширяются. Даже если я установлю для параметра "Горизонтальная политика" QTreeWidget значение "Минимум", результат будет тот же.   -  person Andrejs Cainikovs    schedule 18.12.2011
comment
Попробуйте QSizePolicy::Maximum вместо QTreeWidget. И QSizePolicy::Expanding для QTableWidget Минимум на самом деле не означает, что виджет должен иметь минимальный размер, прочитайте этот документ: developer.qt.nokia.com/doc/qt-4.8/qsizepolicy.html   -  person Lol4t0    schedule 19.12.2011
comment
Нет, установка политики горизонтального размера QTreeWidget на Maximum дает тот же результат.   -  person Andrejs Cainikovs    schedule 19.12.2011


Ответы (2)


Подсказка о размере ширины 256 жестко закодирована в QAbstractScrollArea. (Почему? Понятия не имею.) Вот метод из qabstractscrollarea.cpp:

QSize QAbstractScrollArea::sizeHint() const
{
    return QSize(256, 192);
#if 0
    Q_D(const QAbstractScrollArea);
    int h = qMax(10, fontMetrics().height());
    int f = 2 * d->frameWidth;
    return QSize((6 * h) + f, (4 * h) + f);
#endif
}

Я не уверен, что происходит с макросом 0... может быть, кто-то начал реализовывать незахардкоженную ширину, но не закончил, и это для тестирования?

В любом случае, вы можете обойти это, создав подкласс QTreeView и внедрив собственную подсказку о размере, например:

class MyTreeView : public QTreeView {
public:
  explicit MyTreeView(QWidget *parent = NULL) : QTreeView(parent) { }
  QSize sizeHint() const {
    return QSize(150, 192);
  }
};
person Dave Mateer    schedule 19.12.2011

Вы пытались установить sizePolicy / HorizontalPolicy на Fixed ?

person TonyK    schedule 19.12.2011
comment
Да, изменение sizePolicy на другие значения не решило эту проблему. Но Дэйв Мэтир указал на основную причину проблемы. - person Andrejs Cainikovs; 19.12.2011