Виджет Qt изменяет размер до ширины = 256, но не должен - PullRequest
4 голосов
/ 17 декабря 2011

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

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

Свойства по умолчанию этих двух виджетов в QSplitter:

  • QTreeWidget

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

  • QTableWidget

    минимальный размер / ширина = 300
    sizePolicy / Horizontal Stretch = 1

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

Вопрос:

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

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


ОБНОВЛЕНИЕ:

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

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

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

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

  • Ubuntu 10.04 (Lucid Lynx) x86_64
  • GCC 4.4.3
  • Qt 4.6.2

Ответы [ 2 ]

3 голосов
/ 19 декабря 2011

Размер подсказки шириной 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);
  }
};
0 голосов
/ 19 декабря 2011

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

...