Вот один, который я написал некоторое время назад, которое вы можете использовать.
У него есть класс «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);
}
}
Вам не нужно реализовывать собственный менеджер компоновки. Вы можете унаследовать 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 .
Вызов resize()
из resizeEvent()
никогда не работал хорошо на меня - в лучшем случае он вызовет мерцание, поскольку окно изменено дважды (как Вы имеете), в худшем случае бесконечный цикл.
я думаю, что "корректный" способ поддержать фиксированное соотношение сторон состоит в том, чтобы создать пользовательский макет. Необходимо будет переопределить всего два метода, QLayoutItem::hasHeightForWidth()
и QLayoutItem::heightForWidth()
.
Правильный ответ должен создать Вашего менеджера по пользовательскому макету. Это возможно путем разделения на подклассы QLayout.