Найти - Пользователи
Полная версия: Перерисовка окна после изменения в PyQt
Начало » GUI » Перерисовка окна после изменения в PyQt
1
st00nsa
Хочется программку с динамическим интерфейсом, что бы кнопки добавлялись в том количестве в которому укажет пользователь. Написал пока так что когда дергаешь слайдер, добавляется кнопка в специальный лайаут. Попробовал написать что бы еще нажимаешь на заранее созданную кнопку и кнопки удаляется, и вот код
from PyQt4 import Qt
import sys


class Window:
def __init__(self):
self.app = Qt.QApplication(sys.argv)

self.window = Qt.QWidget()
self.window.setWindowTitle(u"-")
self.window.setGeometry(100,100,300,300)

self.layout = Qt.QVBoxLayout()
#self.layout.addStretch(1)
self.window.setLayout(self.layout)



slider = Qt.QSlider(Qt.Qt.Horizontal)
slider.setRange(0, 100)

self.layout.addWidget(slider)
delBut = Qt.QPushButton(u"удалить все кнопки")


self.layout.addWidget(delBut)


label = Qt.QLabel("1")
self.layout.addWidget(label)

Qt.QObject.connect(slider, Qt.SIGNAL("valueChanged(int)"), self.add_button)
Qt.QObject.connect(delBut, Qt.SIGNAL("clicked()"), self.del_buttons)


self.layoutB = Qt.QVBoxLayout()

self.layout.addLayout(self.layoutB)


self.window.show()
self.app.exec_()
def add_button(self,text):
button = Qt.QPushButton(str(text))
self.layoutB.addWidget(button)

def del_buttons(self):
while self.layoutB.count():
item = self.layoutB.itemAt(0)
self.layoutB.removeItem(item)
self.window.repaint()
Кнопки перестают растягиваться вместе с окном после нажатия на удаляющую кнопку, то есть наверное они как-то удаляются, но вот как перерисовать окно что бы оно было чистым не очень понятно.

Что вообще почитать что бы узнать какие функции есть у контролов и вообще по PyQt?
pasaranax
А ты их и не удаляешь, просто из layout-a убираешь, и они становятся сами по себе и поэтому стоят на месте. Помещай новые кнопки в список и рули элементами списка.
а self.window.repaint() пожалуй стоит заменить на self.window.update()
st00nsa
просто список? buttons.append(button)? Если да то потом как удалить?
pasaranax
Именно, самый простой способ отследить множество кнопок.
Удалять, как обычно: buttons.pop() или del buttons.

апд: щас пример наклепаю, забавная тема

адп: Действительно, все не так просто оказалось. Чтобы удалить виджет, его надо лишить родителя, иначе на него где-то еще хранятся ссылки (в родителе?), и он существует. Вот пример рабочего кода:
from PyQt4.QtGui import *
from PyQt4.QtCore import *
import sys

class Window(QWidget):
def __init__(self, parent=None):
QWidget.__init__(self, parent)
self.layout = QVBoxLayout(self)
self.layout.setAlignment(Qt.AlignTop)
self.slider = QSlider(Qt.Horizontal, self)
self.slider.setMaximum(10)
self.layout.addWidget(self.slider)
self.slider.valueChanged.connect(self.addOrRemoveButton)
self.buttons = []

def addOrRemoveButton(self, value):
if value > len(self.buttons):
self.buttons.append(QPushButton(self))
self.layout.addWidget(self.buttons[-1])
else:
self.layout.removeWidget(self.buttons[-1]) # удаляем из layout-a
self.buttons[-1].setParent(None) # лишаем родителя
del self.buttons[-1] # удаляем физически


if __name__ == '__main__':
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())
st00nsa
спасибо, за пример. но говорит что атрибута valueChanged нету self.slider.valueChanged.connect(self.addOrRemoveButton) у слайдера. А что можно так сигналы писать?
pasaranax
Это новый стиль, который появился в PyQt 4.5, у тебя наверное версия меньше.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB