Как поддержать соотношение сторон виджетов в QT?

Вот один, который я написал некоторое время назад, которое вы можете использовать.

У него есть класс «MultiValueDictionary», который наследуется от Словаря.

Он также имеет класс расширения, который позволяет вам использовать специальную функцию добавления в любом словаре, где тип значения - это IList; таким образом вы не будете вынуждены использовать пользовательский класс, если вы этого не хотите.

public class MultiValueDictionary<KeyType, ValueType> : Dictionary<KeyType, List<ValueType>>
{
    /// <summary>
    /// Hide the regular Dictionary Add method
    /// </summary>
    new private void Add(KeyType key, List<ValueType> value)
    {            
        base.Add(key, value);
    }

    /// <summary>
    /// Adds the specified value to the multi value dictionary.
    /// </summary>
    /// <param name="key">The key of the element to add.</param>
    /// <param name="value">The value of the element to add. The value can be null for reference types.</param>
    public void Add(KeyType key, ValueType value)
    {
        //add the value to the dictionary under the key
        MultiValueDictionaryExtensions.Add(this, key, value);
    }
}

public static class MultiValueDictionaryExtensions
{
    /// <summary>
    /// Adds the specified value to the multi value dictionary.
    /// </summary>
    /// <param name="key">The key of the element to add.</param>
    /// <param name="value">The value of the element to add. The value can be null for reference types.</param>
    public static void Add<KeyType, ListType, ValueType>(this Dictionary<KeyType, ListType> thisDictionary, 
                                                         KeyType key, ValueType value)
    where ListType : IList<ValueType>, new()
    {
        //if the dictionary doesn't contain the key, make a new list under the key
        if (!thisDictionary.ContainsKey(key))
        {
            thisDictionary.Add(key, new ListType());
        }

        //add the value to the list at the key index
        thisDictionary[key].Add(value);
    }
}
32
задан Bleadof 16 January 2009 в 23:05
поделиться

3 ответа

Вам не нужно реализовывать собственный менеджер компоновки. Вы можете унаследовать QWidget и переопределить

int QWidget::heightForWidth( int w ) { return w; }

, чтобы оставаться квадратным. Однако heightForWidth () не работает с окнами верхнего уровня на X11, поскольку, очевидно, протокол X11 не поддерживает это. Что касается центрирования, вы можете передать Qt :: AlignCenter в качестве третьего параметра QBoxLayout :: addWidget () или пятого параметра QGridLayout :: addWidget () .

Примечание: По крайней мере, в более новых версиях Qt QWidget больше не имеет heightForWidth или widthForHeight (поэтому они не могут быть отменены), и поэтому setWidthForHeight (true) или setHeightForWidth (true) имеют эффект только для потомков QGraphicsLayout .

17
ответ дан 27 November 2019 в 21:10
поделиться

Вызов resize() из resizeEvent() никогда не работал хорошо на меня - в лучшем случае он вызовет мерцание, поскольку окно изменено дважды (как Вы имеете), в худшем случае бесконечный цикл.

я думаю, что "корректный" способ поддержать фиксированное соотношение сторон состоит в том, чтобы создать пользовательский макет. Необходимо будет переопределить всего два метода, QLayoutItem::hasHeightForWidth() и QLayoutItem::heightForWidth().

5
ответ дан 27 November 2019 в 21:10
поделиться

Правильный ответ должен создать Вашего менеджера по пользовательскому макету. Это возможно путем разделения на подклассы QLayout.

Методы для реализации при разделении на подклассы QLayout

освобождают addItem (QLayoutItem* объект);
Добавляет объект к расположению.
количество интервала
() константа;
Возвраты количество объекта.
QLayoutItem* itemAt (международный индекс) константа;
ссылка объекта Возвратов в индексе или 0, если нет ни одного.
QLayoutItem* takeAt (международный индекс);
Берет и возвращает объект из расположения от индекса или возвращается 0, если нет ни одного.
кварта:: Ориентации expandingDirections () константа;
Возвраты разметки, расширяющие направления.
bool hasHeightForWidth () константа;
Говорит, обрабатывает ли расположение высоту для расчета ширины.
QSize minimumSize () константа;
Возвраты размер минимума разметок.
освобождают setGeometry (константа QRect& реагир);
Наборы геометрия расположения и объектов в нем. Здесь необходимо поддержать соотношение сторон и сделать центрирование.
QSize sizeHint () константа;
Возвраты предпочтительный размер для расположения.
дополнительные материалы для чтения

8
ответ дан 27 November 2019 в 21:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: