С Новым годом! Форум программистов, компьютерный форум, киберфорум
Python: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
3 / 3 / 0
Регистрация: 31.10.2019
Сообщений: 26

Как добавить неограниченное количество виджетов?

01.11.2019, 14:41. Показов 2278. Ответов 14

Студворк — интернет-сервис помощи студентам
Опишу всё по сути:
  • Существует область - GridLayout.
  • Существует кнопка - добавить
  • По нажатию кнопки "добавить" в область GridLayout добавляется ряд виджетов: ComboBox, DateTimeEdit и LineEdit.

Что должно происходить дальше:
  • По нажатию кнопки "добавить" n-ый разв область GridLayout добавляется n-ый ряд тех же виджетов.
  • Виджеты всегда сохраняют свой размер
  • Когда количество виджетов становится больше размеров области, у области появляются полосы прокрутки.

Я пытался выполнить это с помощью scrollArea, поместив в scrollArea GridLayout, но ряды виджетов стали наслаиваться друг на друга.

В интернете я нашел похожую проблему на другом форуме, но я не совсем понял ответ на эту задачу. Если это поможет то:

Прошу помочь решить эту задачу самым рациональным и более-менее простым способом!

Можно просто объяснить "на словах", но все же хорошо, если будут примеры =)
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.11.2019, 14:41
Ответы с готовыми решениями:

Как в питоне сделать неограниченное количество массивов в разных строках
Как в питоне сделать неограниченное количество массивов в разных строках и чтобы программа могла с ними работать. Например, ввод 1 2 3 ...

Как передать в функцию неограниченное количество параметров?
Для наглядности Всем нам известно что функция Console.Write() фактически безразмерна. Я могу написать как ...

Как можно проголосовать неограниченное количество раз?
Здравствуйте !!! Люди добрые можете подкинуть идею по поводу голосования на сайтах , можно ли как нибудь обойти это голосование. У меня...

14
Модератор
Эксперт Python
 Аватар для Fudthhh
2695 / 1601 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
01.11.2019, 15:39
StudentOfChrist, код в студию.

Добавлено через 25 минут
Объясню логику работы, скинешь код, покажу наглядно.

1) Событие добавления виджетов, должно менять минимальный(фиксированный) размер главного виджета.
2) Виджет помещаем в QScrollArea
3) ????
4) PROFIT!!!
0
3 / 3 / 0
Регистрация: 31.10.2019
Сообщений: 26
05.11.2019, 08:53  [ТС]
Вот уродливый набросок-пример:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QApplication, QWidget, QMainWindow
 
 
class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(402, 346)
 
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
 
        self.scrollArea = QtWidgets.QScrollArea(self.centralwidget)
        self.scrollArea.setGeometry(QtCore.QRect(120, 40, 201, 80))
        self.scrollArea.setWidgetResizable(True)
        self.scrollArea.setObjectName("scrollArea")
        self.scrollAreaWidgetContents = QtWidgets.QWidget()
        self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 199, 78))
        self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents")
 
        self.verticalLayoutWidget = QtWidgets.QWidget(self.scrollAreaWidgetContents)
        self.verticalLayoutWidget.setGeometry(QtCore.QRect(0, 0, 201, 80))
        self.verticalLayoutWidget.setObjectName("verticalLayoutWidget")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget)
        self.verticalLayout.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout.setObjectName("verticalLayout")
 
        self.scrollArea.setWidget(self.scrollAreaWidgetContents)
 
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(170, 130, 111, 23))
        self.pushButton.setObjectName("pushButton")
 
        MainWindow.setCentralWidget(self.centralwidget)
 
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 402, 21))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
 
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)
 
        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)
 
    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.pushButton.setText(_translate("MainWindow", "Добавь кнопку"))
 
 
class MainWindow(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.main()
    
    def main(self):
        self.pushButton.clicked.connect(self.addPushButton)
    
    def addPushButton(self):
        _translate = QtCore.QCoreApplication.translate
 
        self.newPushButton = QtWidgets.QPushButton(self.centralwidget)
        self.newPushButton.setObjectName("newPushButton")
        self.newPushButton.setText(_translate('MainWindow', 'Кнопка'))
 
        self.verticalLayout.addWidget(self.newPushButton)
 
 
app = QtWidgets.QApplication(sys.argv)
ex = MainWindow()
ex.show()
sys.exit(app.exec_())
В нем видно, как кнопки наслаиваются друг на друга, а полоски прокрутки так и не появляются(

P.S. если увеличить layout внутри scrollArea, ситуация не улучшается - полоски прокрутки не появляются.
P.P.S. а можно, чтобы еще и spacer внизу был?

Добавлено через 1 минуту
P.P.P.S. меняя политику кнопок, тоже лучше не становится
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
05.11.2019, 10:05
StudentOfChrist, если вам надо расположить их в вертикальную колбасу, то QVerticalLayout (вместо GridLayout).
А ваши мелкие элементы - ComboBox, DateTimeEdit и LineEdit - лучше объединить в один класс-виджет.
0
3 / 3 / 0
Регистрация: 31.10.2019
Сообщений: 26
05.11.2019, 10:13  [ТС]
В примере я использовал VerticalLayout, но тем не менее, кнопки просто наслаиваются друг на друга.
А мне нужно, чтобы они отображались каждая отдельно от другой, причем, если они не помещаются в область, то должны появляться полоски прокрутки. Но пока, эти кнопки просто уменьшаются (а если "зафиксить" размер, то наслаиваются).
0
1293 / 677 / 367
Регистрация: 07.01.2019
Сообщений: 2,301
05.11.2019, 10:23
Цитата Сообщение от StudentOfChrist Посмотреть сообщение
Но пока, эти кнопки просто уменьшаются (а если "зафиксить" размер, то наслаиваются).
пробовать refresh, repaint
0
3 / 3 / 0
Регистрация: 31.10.2019
Сообщений: 26
05.11.2019, 10:25  [ТС]
[quote="dondublon;13964267"]StudentOfChrist, если вам надо расположить их в вертикальную колбасу, то QVerticalLayout

А как? Можете, пожалуйста, логику объяснить?
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
05.11.2019, 10:39
StudentOfChrist, а что тут объяснять-то, у Qt отличная документация, а случай простой.
https://doc.qt.io/qt-5/qvboxlayout.html

(Сорри, название перепутал, давно с Qt не работал.)
0
3 / 3 / 0
Регистрация: 31.10.2019
Сообщений: 26
05.11.2019, 10:42  [ТС]
Цитата Сообщение от tooru Посмотреть сообщение
пробовать refresh, repaint
А как? Можете, пожалуйста, логику объяснить?
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
05.11.2019, 12:10
StudentOfChrist, вы setLayout сделали? Похоже, нет. А ведь в примере в доке оно есть. Всё-таки стоило посмотреть.
0
3 / 3 / 0
Регистрация: 31.10.2019
Сообщений: 26
06.11.2019, 06:32  [ТС]
Вы пример смотрели? Похоже, нет. А ведь тогда бы все понятней было. Все-таки стоило посмотреть)
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
06.11.2019, 09:43
StudentOfChrist, посмотрел. Ниасилил, многабукаф.
0
3 / 3 / 0
Регистрация: 31.10.2019
Сообщений: 26
06.11.2019, 09:45  [ТС]
Ну хоть запустили бы)
0
1293 / 677 / 367
Регистрация: 07.01.2019
Сообщений: 2,301
06.11.2019, 10:48
Лучший ответ Сообщение было отмечено StudentOfChrist как решение

Решение

Хитро там, оказываться, сделано

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
import sys
from PyQt5.QtWidgets import *
 
class App(QWidget):
 
    def __init__(self):
        super().__init__()
        self.title = 'PyQt51.04'
        self.left = 100
        self.top = 100
        self.width = 320
        self.height = 200
        self.i = 0
        self.initUI()
    
    def initUI(self):
        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)
 
        self.scrollArea = QScrollArea()
        self.scrollArea.setWidgetResizable(True)
        self.layout = QGridLayout()
        
        button = QPushButton('PyQt5 button', self)
        button.clicked.connect(self.on_click)
        button.setFixedHeight(24)
 
        self.layout.addWidget(button, self.i, 0)
 
        self.inner = QFrame(self.scrollArea)
        self.inner.setLayout(self.layout)
        self.scrollArea.setWidget(self.inner)
 
        layout = QVBoxLayout()
        layout.addWidget(self.scrollArea)
        self.setLayout(layout)
        self.show()
 
    def on_click(self):
        self.i += 1
        button = QPushButton('PyQt5 button', self)
        button.setFixedHeight(24)
        self.inner.layout().addWidget(button, self.i, 0)
 
 
if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = App()
    sys.exit(app.exec_())
0
3 / 3 / 0
Регистрация: 31.10.2019
Сообщений: 26
07.11.2019, 11:20  [ТС]
Глазам своим не верю, вы сделали это! СПАСИ-И-И-И-БО!!!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.11.2019, 11:20
Помогаю со студенческими работами здесь

Как добавлять неограниченное количество Image с помощью Button1.Click?
как добавлять неограниченное количество Image с помощью Button1.Click

Как сделать чтобы можно было вводить неограниченное количество команд?
Здравтсвуйте, у меня есть такая программа в с. Она выполняет 2 команды вводимые с терминала. Как сделать чтобы можно было воодить...

Рекурсия. Найти количество способов, которым можно выплатить сумму, имея неограниченное количество монет данного номинала
Помогите объяснить задачу Дано N монет различных номиналов А1, А2 … АN (Аi < Ai+1). Дана сумма S. Необходимо найти количество...

Неограниченное количество значений
Задали вот такую задачку , до сих пор не могу решить. Помогите. 1) Программа должна позволять ввести неограниченное количество значений и...

Неограниченное количество плей листов
Господа программисты! Подскажите пожалуйста, как с помощью TabControl можно динамически создавать неограниченное количество плей листов.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru