PyQt - как элемент может существовать без указателя? - PullRequest
2 голосов
/ 23 мая 2011

Эта программа показывает окно и 3 кнопки.
Кнопки генерируются путем итерации for i in range(3):.

Я не понимаю этого:
Если button в конце содержит только последнюю кнопку, где все остальные кнопки?
Почему они не удаляются, когда button начинает ссылаться на другой элемент?

import sys
from PyQt4.QtGui import *

class MainWindow(QWidget):
    def __init__(self, parent=None):
        QWidget.__init__(self, parent)

        self.vbox = QVBoxLayout()

        for i in range(3):
            button = QPushButton(str(i), self)
            self.vbox.addWidget(button)

        self.setLayout(self.vbox)

app = QApplication(sys.argv)
myapp = MainWindow()
myapp.show()
sys.exit(app.exec_())

К чему все кнопки прикреплены?
И как я могу получить к ним доступ? button для последней созданной кнопки, но для других кнопок?

Ответы [ 3 ]

3 голосов
/ 23 мая 2011

Ссылка на кнопку хранится в объекте 'vbox'.

2 голосов
/ 23 мая 2011

Вызывая addWidget, вы «прикрепляете» кнопку к представлению, и в этом представлении хранятся некоторые ссылки на его дочерние элементы.Если вы хотите получить к ним доступ из своего скрипта, я бы посоветовал вам сохранить их как локальную (или экземплярную) переменную.

Что-то вроде:

class MainWindow(QWidget):
    def __init__(self, parent=None):
        QWidget.__init__(self, parent)

        self.vbox = QVBoxLayout()
        self.buttons = []

        for i in range(3):
            button = QPushButton(str(i), self)
            self.vbox.addWidget(button)
            self.buttons += [button]

        self.setLayout(self.vbox)
0 голосов
/ 23 мая 2011

Вы можете использовать метод itemAt класса QLayout (который является родительским классом VBoxLayout), чтобы получить экземпляры QlayoutItems.Класс QLayoutItem имеет метод widget , который можно использовать для получения добавленных виджетов.

Например, в приведенном ниже фрагменте кода добавлен вызов items' method in MainWindow would print text string of the QPushButton` (т. Е. 0,1,2).

</p> <pre><code>class MainWindow(QWidget): def __init__(self, parent=None): # same as the posted code def items(self): for i in range(self.vbox.count()): item = self.vbox.itemAt(i) print item.widget().text() app = QApplication(sys.argv) myapp = MainWindow() myapp.show() myapp.items() sys.exit(app.exec_()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...