Qt: Как я могу выровнять виджеты в двух разных QGridLayouts? - PullRequest
0 голосов
/ 27 сентября 2019

Я пытаюсь выстроить виджеты из двух разных QGridLayouts.Идея заключается в следующем: у меня есть много строк виджетов в QGridLayout рамки прокрутки.Каждая строка содержит, возможно, 8 столбцов других виджетов (таким образом, сетка из 8xN виджетов, N = количество строк).Первый виджет в этой строке представляет собой кнопку «показать / скрыть», которая при включении отображает другой виджет с таким же макетом чуть ниже этой строки (т. Е. Указанный виджет имеет строки виджетов, каждая строка имеет 7 столбцов виджетов).Таким образом, показанный виджет будет вставлен изначально и будет показан / скрыт при переключении кнопки показа.

Изображение ниже иллюстрирует мою настройку.Виджеты, помеченные красной скобкой с надписью «A», - это те, которые я показываю при установке флажка слева (у них нет собственной кнопки показа).

enter image description here

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

  • Поместите все виджеты в один макет и просто переберите виджеты, которые мне нужно показать / скрыть, чтобы сделать это.Преимущество этого заключается в том, что все виджеты выстроены в линию, поскольку они находятся в одном макете.Плохо то, что, если у меня есть сотни строк виджетов (что является обычным явлением), очень много времени уходит на ОЧЕНЬ много времени на их показ.
  • Поместите подвиджеты в их собственный контейнерный виджет и покажите / спрячьтеКнопка просто показать / скрыть этот виджет.Преимущество в том, что это намного НАМНОГО быстрее, чем показывать / скрывать каждый отдельный виджет, но плохая сторона заключается в том, что виджеты теперь не выстроены в ряд, потому что подвиджеты находятся в другом макете.Я думаю, что это лучший путь.Мне просто нужно выяснить, как выровнять все подобные виджеты.

Надеюсь, это было понятно.Я использую Qt 5.11.Заранее спасибо за помощь.

1 Ответ

0 голосов
/ 28 сентября 2019

Что ж, если у вас так много виджетов, что они медленно загружаются на современном компьютере, вы, возможно, захотите использовать другую стратегию, когда вы загружаете фактические виджеты «лениво».Даже скрытые, они генерируют время, память для хранения и так далее.OTOH, что-то вроде фреймворка модель / представление, показывает относительно легкие надписи только для отображения, пока не будет запрошено редактирование, и только тогда рисует (относительно) сложный виджет редактора.И представления имеют условия для загрузки дополнительных данных по требованию (отложенная загрузка), и это то, что вы ищете.

Но в любом случае, чтобы ответить на ваш вопрос, вам в основном нужно будет отслеживать ширину "опорная "сетка" (может быть, ваша первая), и вручную установите столбцы сетки на любых дополнительных сетках.Что не так сложно, так как вы можете легко перебрать столбцы и вызвать QGridLayout::setColumnMinimumWidth().Другой вариант вместо «эталонной сетки» будет рассчитать ширину столбцов себя

QGridLayout gl1;
gl1.setSizeConstraint(QLayout::SetMinimumSize);  // maybe

gl1.addWidget(..., 0, 0);
gl1.addWidget(..., 0, 1);
gl1.addWidget(..., 0, 2);
gl1.activate();  // or show it or something... it needs to calculate its sizeHint().

QVector<int> colWidths;
for (int i=0; i < gl1.columnCount(); ++i)
  colWidths << gl1.columnMinimumWidth(i);

QGridLayout gl2;
gl2.addWidget(..., 0, 0);
gl2.addWidget(..., 0, 1);
gl2.addWidget(..., 0, 2);

for (int i : colWidths)
  gl2.setColumnMinimumWidth(i);

Это упрощенно может быть, но, по сути вы»(хотя, конечно, это более активное участие, если вы хотите, чтобы адаптироваться к ширине содержимого).Вам понадобится подход "грубой силы", чтобы использовать отдельные макеты.Это очень поможет, если виджеты в макетах имеют фиксированную ширину, и если вы знаете их заранее, это станет еще проще.Также может быть полезно создать подкласс типа макета, свернуть свой собственный или собрать сетку из отдельных макетов H / V-блоков.

Но на самом деле, как только вы говорите «сотни виджетов», я просто думаю,«нет».BTDT.Я бы взглянул на структуру модель / представление и, возможно, подумал бы о реализации моего собственного QAbstractItemView, если ситуация действительно настолько отчаянная.:)

...