PyQt4, Как добавить пакет виджета (QPushButton) когда-то и позволяет им для выполнения на СЛОТЕ

если я хочу добавить 10 QPushButton когда-то:

NumCount=20
for i in range(NumCount):
  btn=QPushButton("%s %s" %("Button" i+1),self)
  btn.clicked.connect(self.btnclick)

def btnclick(self):
  # here is my question 
  # how to define which button clicked?
  # how to print btn.text?

как указано в определении (btnclick).

7
задан Macke 18 February 2010 в 21:22
поделиться

4 ответа

Лучшая альтернатива - использовать параметризованные запросы, тогда не нужно избегать последовательностей.

Если вы по-прежнему хотите собрать запрос вместе, правильный способ избежать строкового литерала для SQL Server (T-SQL) - заменить каждый апостроф (') в последовательности двумя апострофами.

-121--1918176-

Предполагается, что поддержка SSL включена для модуля socket .

connection1 = httplib.HTTPSConnection('www.somesecuresite.com')
-121--1186129-

Когда вы находитесь в слоте, вы можете использовать метод sender () (просто вызовите self.sender ()) и получите ссылку на объект, из которого был выдан сигнал. Вот документация об этом.

3
ответ дан 7 December 2019 в 10:02
поделиться

Я бы создал подкласс QPushButton и определил свой собственный отправитель и слот. Метод QObject.sender () заманчив, но вызывает у меня хиби-джиби.

class MyPushButton(QPushButton):
    def __init__(self, text = '', parent = None):
        QPushButton.__init__(self, text, parent)
        self.clicked.connect(self._handle_click)

    my_click = QtCore.pyqtSignal(QObject)

    def _handle_click(self):
        my_click.emit(self)

def btnclick(btn):
    print 'Handle button %s' % btn

for i in xrange(20):
    btn = MyPushButton('%s %s' % ('Button', i + 1), self)
    btn.my_click.connect(btnclick)

Чуть более питоновский способ сделать это может определять поведение внутри класса, например:

class MyPushButton(QPushButton):
    def __init__(self, button_number, parent = None):
        QPushButton.__init__(self, '%s %s' % ('Button', button_number), parent)
        self.button_number = button_number
        self.clicked.connect(self._handle_click)

     def _handle_click(self):
        print 'Handle button %s' % self

for i in xrange(20):
    btn = MyPushButton(i + 1, self)
2
ответ дан 7 December 2019 в 10:02
поделиться

Как сказал gruszcsy, есть self. sender() (в QObject) для получения именно такой информации.

Существует также класс QSignalMapper, который обеспечивает более высокоуровневое отображение нескольких отправителей сигналов на один слот. Он помогает в основных случаях отображения сигналов/слотов "многие к одному".

Предложение Криса Б об определении нового слота, передающего отправителя в качестве параметра, немного сложнее, но чище с точки зрения структуры программы и разделения между классами. Я склонен использовать этот метод, когда целевой слот находится в другом объекте. Для сопоставления внутри приватного слота класса, sender() является и аккуратным, и вполне подходящим, IMO.

1
ответ дан 7 December 2019 в 10:02
поделиться

Вот небольшое приложение, демонстрирующее одно из возможных решений:

from PyQt4.QtGui import QPushButton, QWidget
from PyQt4.QtGui import QVBoxLayout, QApplication

def smart_connect(btn, btn_click_slot):
    proxy_slot = lambda checked: btn_click_slot(btn)
    btn.clicked.connect(proxy_slot)

class MyWidget(QWidget):
    btn_count = 4
    def __init__(self):
        super(MyWidget, self).__init__()
        lt = QVBoxLayout(self)
        for i in range(self.btn_count):
            btn = QPushButton("Button %s"%(i+1))
            smart_connect(btn, self.btn_click)
            lt.addWidget(btn)
    def btn_click(self, btn):
        print "Button '%s' was clicked."%btn.text()

app = QApplication([])
wgt = MyWidget()
wgt.show()
app.exec_()

Пожалуйста, наслаждайтесь :)

0
ответ дан 7 December 2019 в 10:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: