Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » GUI
  • » Перерисовка окна после изменения в PyQt [RSS Feed]

#1 Ноя. 25, 2009 15:27:11

st00nsa
От:
Зарегистрирован: 2009-01-14
Сообщения: 36
Репутация: +  0  -
Профиль   Отправить e-mail  

Перерисовка окна после изменения в PyQt

Хочется программку с динамическим интерфейсом, что бы кнопки добавлялись в том количестве в которому укажет пользователь. Написал пока так что когда дергаешь слайдер, добавляется кнопка в специальный лайаут. Попробовал написать что бы еще нажимаешь на заранее созданную кнопку и кнопки удаляется, и вот код

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?



Офлайн

#2 Ноя. 25, 2009 19:22:58

pasaranax
От:
Зарегистрирован: 2009-06-13
Сообщения: 574
Репутация: +  0  -
Профиль   Отправить e-mail  

Перерисовка окна после изменения в PyQt

А ты их и не удаляешь, просто из layout-a убираешь, и они становятся сами по себе и поэтому стоят на месте. Помещай новые кнопки в список и рули элементами списка.
а self.window.repaint() пожалуй стоит заменить на self.window.update()



Офлайн

#3 Ноя. 25, 2009 20:00:51

st00nsa
От:
Зарегистрирован: 2009-01-14
Сообщения: 36
Репутация: +  0  -
Профиль   Отправить e-mail  

Перерисовка окна после изменения в PyQt

просто список? buttons.append(button)? Если да то потом как удалить?



Офлайн

#4 Ноя. 25, 2009 20:11:57

pasaranax
От:
Зарегистрирован: 2009-06-13
Сообщения: 574
Репутация: +  0  -
Профиль   Отправить e-mail  

Перерисовка окна после изменения в PyQt

Именно, самый простой способ отследить множество кнопок.
Удалять, как обычно: 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_())



Отредактировано (Ноя. 25, 2009 21:14:16)

Офлайн

#5 Ноя. 25, 2009 23:24:53

st00nsa
От:
Зарегистрирован: 2009-01-14
Сообщения: 36
Репутация: +  0  -
Профиль   Отправить e-mail  

Перерисовка окна после изменения в PyQt

спасибо, за пример. но говорит что атрибута valueChanged нету self.slider.valueChanged.connect(self.addOrRemoveButton) у слайдера. А что можно так сигналы писать?



Офлайн

#6 Ноя. 26, 2009 21:25:55

pasaranax
От:
Зарегистрирован: 2009-06-13
Сообщения: 574
Репутация: +  0  -
Профиль   Отправить e-mail  

Перерисовка окна после изменения в PyQt

Это новый стиль, который появился в PyQt 4.5, у тебя наверное версия меньше.



Офлайн

  • Начало
  • » GUI
  • » Перерисовка окна после изменения в PyQt[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version