Область прокрутки - установить виджет/макет?

У меня есть определение класса, в котором используется QVBoxLayout (main_layout), где у меня есть несколько кнопок.

Под этим у меня в настоящее время есть тонна групповых ящиков

Я хотел бы поместить эти элементы (после кнопок) внутри QScrollArea, чтобы кнопки оставались «заблокированными» в моем пользовательском интерфейсе, а другие виджеты можно было прокручивать.

У меня проблема в том, что QScrollArea имеет только функцию setWidget — как мне передать ей все эти другие виджеты? Я не хочу помещать их в другой класс вообще

Например, QScrollArea.setLayout() был бы полезен здесь!

Я попытался поместить все эти виджеты в новый sub_layout QVBoxLayout , мне просто нужен виджет прокрутки, управляющий им.

Есть предположения ?

главная в лайют

main_layout  = qw.QVBoxLayout()
self.layout().addLayout(main_layout)

#do it button added to main layout not scroll area

self.run_button = customButton("place between components",parent=self)
self.run_button.setFixedWidth(315)
self.run_button.setFixedHeight(30)
main_layout.addWidget(self.run_button)

#make the scroll area
scrollArea = qw.QScrollArea()
subWidget = qw.QWidget()
subWidget.setContentsMargins(0,0,0,0)
sub_layout = qw.QVBoxLayout()
subWidget.setLayout(sub_layout)
scrollArea.setWidget(subWidget)

#add it to the main layout
main_layout.addWidget(scrollArea)




#all my extra layouts and widgets for options are declared

#pins v layout
pins_main_v_layout = qw.QVBoxLayout()
pins_main_v_layout.setSpacing(4)
pins_main_v_layout.setContentsMargins(2,2,2,2)

#stitching v layout
stitching_main_v_layout = qw.QVBoxLayout()
stitching_main_v_layout.setContentsMargins(2,2,2,2)

#cable v layout
cable_main_v_layout = qw.QVBoxLayout()
cable_main_v_layout.setContentsMargins(2,2,2,2)


#add the options layouts to the scroll area sub widget


sub_layout.addLayout(pins_main_v_layout)
sub_layout.addLayout(stitching_main_v_layout)
sub_layout.addLayout(cable_main_v_layout)


# all the options and further layouts, widgets declared from here 
# i include one example below

#PINS
#define the contents pins layout

#main pins box
pins_vbox_group_layout = qw.QVBoxLayout()
pins_vbox_group_layout.setSpacing(4)
self.pins_group_box = qw.QGroupBox('pins')
self.pins_group_box.setAlignment(qc.Qt.AlignHCenter)
self.pins_group_box.setCheckable(True)
pins_main_v_layout.addWidget(self.pins_group_box)
self.pins_group_box.setLayout(pins_vbox_group_layout)
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
595
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам нужно создать промежуточный виджет, в котором вы устанавливаете макет, и его можно поместить в QScrollArea:

widget = QtWidgets.QWidget()
widget.setContentsMargins(0, 0, 0, 0)
widget.setLayout(sub_layout)
scrollarea.setWidget(widget)

Спасибо. Будут ли все мои последующие виджеты и макеты добавлены в этот новый «sub_layout» вместо этого?

blam 10.04.2019 22:37

@blam я изменил код, чтобы использовать имя вашей переменной

eyllanesc 10.04.2019 22:40

Спасибо - это помогло. У меня по-прежнему возникают проблемы с добавлением моих виджетов и макетов в sub_layout и их отображением — в Maya не сообщается об ошибках. Я использую sub_layout.addLayout(myOptionsLayoutA), но он не отображается внутри макета прокрутки. Раньше это был main_layout.addLayout(myOptionsLayoutA). Я убедился, что область прокрутки также добавлена ​​в main_layout. Например, текущий стек: main_layout>scrollarea (с виджетом) >>widget (с макетом sub_layout) >> sub_layout содержит мои элементы управления, виджеты и макеты.

blam 10.04.2019 23:04

Я понимаю, что ввод моего псевдокода бесполезен, он просто показывает, что я добавил виджет прокрутки обратно в основной макет.

blam 10.04.2019 23:05

@blam Без минимальный воспроизводимый пример я не могу вам помочь

eyllanesc 10.04.2019 23:06

Не беспокойтесь, я через секунду скопирую пасту со своего компьютера, а не с мобильного!

blam 10.04.2019 23:06

Я вставил текущий фрагмент кода в качестве «ответа», так как не мог понять, как включить фрагмент кода в комментарий — это нормально?

blam 10.04.2019 23:20

@blam Нет, этот раздел предназначен для ответа, код должен быть размещен как редакция вашего вопроса.

eyllanesc 10.04.2019 23:21

спасибо - удалили мой ответ и добавили его к исходному вопросу в качестве редактирования

blam 10.04.2019 23:25

@blam меняем только scrollArea = qw.QScrollArea() на scrollArea = qw.QScrollArea(widgetResizable=True)

eyllanesc 10.04.2019 23:28

удивительно - это здорово сейчас. Спасибо ! Я мог бы использовать setFixedWidthHeight в макете виджета/подпрограммы, верно?

blam 10.04.2019 23:30

@blam Я полагаю, да, попробуйте, если это сработает, это лучший способ узнать, работает ли что-то. Если мой ответ вам поможет, не забудьте отметить его как правильный :-)

eyllanesc 10.04.2019 23:33

Другие вопросы по теме