Размещение кнопок в виджете PyQT5
Скажите, какой есть в PyQt5 виджет, в котором можно отображать кнопки?
Например:
по нажатию кнопки "привет", внизу в определенном виджете (например QListWidget, где можно отображать другие виджеты) появятся несколько кликабельных кнопок.
Какой есть виджет, в котором можно размещать кнопки?
Годного примера с ListView и ListWidget с размещением кнопок в инете не смог найти, только размещение текста в виджетах.
Но как быть с кнопками?
Ответы (2 шт):
Автор решения: S. Nick
→ Ссылка
Я очень надеюсь, что в следующий раз, будете предоставлять минимально-воспроизводимый пример.
Попробуйте так:
from PyQt5 import QtWidgets, QtCore, QtGui
class Input_Box(QtWidgets.QDialog):
def __init__(self,parent= None):
super(Input_Box, self).__init__(parent)
open_message = QtWidgets.QLabel("Enter Value:")
self.txt = QtWidgets.QLineEdit()
save = QtWidgets.QPushButton('Save', clicked=self.accept)
cancel = QtWidgets.QPushButton('Cancel', clicked=self.reject)
grid = QtWidgets.QGridLayout(self)
grid.setSpacing(10)
grid.addWidget(open_message, 0, 0)
grid.addWidget(self.txt, 1, 0, 1, 2)
grid.addWidget(save, 2, 0)
grid.addWidget(cancel, 2, 1)
self.setFixedSize(self.sizeHint())
def save(self):
value = self.txt.text()
return value
class Window(QtWidgets.QWidget):
def __init__(self):
super().__init__()
label = QtWidgets.QLabel("Hello World")
self.listWidget = QtWidgets.QListWidget()
addButton = QtWidgets.QPushButton('Add', clicked=self.add_button)
grid = QtWidgets.QGridLayout(self)
grid.setSpacing(10)
grid.addWidget(label)
grid.addWidget(self.listWidget)
grid.addWidget(addButton)
def add_button(self):
input_box = Input_Box()
input_box.setWindowTitle("Window 2")
if input_box.exec_() == QtWidgets.QDialog.Accepted:
val = input_box.save()
newButton = QtWidgets.QPushButton(f'{val}')
newButton.clicked.connect(lambda btn, text=val: self.onClicked(text))
listWidgetItem = QtWidgets.QListWidgetItem()
listWidgetItem.setSizeHint(newButton.sizeHint())
self.listWidget.addItem(listWidgetItem)
self.listWidget.setItemWidget(listWidgetItem, newButton)
self.listWidget.scrollToItem(listWidgetItem)
def onClicked(self, text):
print(text)
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
w = Window()
w.show()
sys.exit(app.exec_())
Автор решения: gil9red
→ Ссылка
Простенький пример по совету из комментарии
Попробуйте:
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QFrame, QPushButton
class MainWindow(QWidget):
def __init__(self):
super().__init__()
self.button_hello = QPushButton('Hello')
self.button_hello.clicked.connect(self.add_button)
self.layout_buttons = QVBoxLayout()
self.layout_buttons.addStretch() # Это добавит пружину, прижимающую виджеты вверх
self.frame = QFrame()
self.frame.setMinimumSize(200, 200)
self.frame.setFrameStyle(QFrame.Box)
self.frame.setLayout(self.layout_buttons)
main_layout = QVBoxLayout()
main_layout.addWidget(self.button_hello)
main_layout.addWidget(self.frame)
self.setLayout(main_layout)
def add_button(self):
button = QPushButton('Кнопка')
self.layout_buttons.insertWidget(0, button) # Добавление в начало, с пружиной это прижмет вверх
# self.layout_buttons.addWidget(button) # Добавление в конец, с пружиной это прижмет вниз
if __name__ == '__main__':
app = QApplication([])
mw = MainWindow()
mw.show()
app.exec()
Скриншот:


