если я хочу добавить 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).
Лучшая альтернатива - использовать параметризованные запросы, тогда не нужно избегать последовательностей.
Если вы по-прежнему хотите собрать запрос вместе, правильный способ избежать строкового литерала для SQL Server (T-SQL) - заменить каждый апостроф (') в последовательности двумя апострофами.
-121--1918176- Предполагается, что поддержка SSL включена для модуля socket
.
connection1 = httplib.HTTPSConnection('www.somesecuresite.com')
-121--1186129- Когда вы находитесь в слоте, вы можете использовать метод sender () (просто вызовите self.sender ()) и получите ссылку на объект, из которого был выдан сигнал. Вот документация об этом.
Я бы создал подкласс 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)
Как сказал gruszcsy, есть self. sender() (в QObject) для получения именно такой информации.
Существует также класс QSignalMapper, который обеспечивает более высокоуровневое отображение нескольких отправителей сигналов на один слот. Он помогает в основных случаях отображения сигналов/слотов "многие к одному".
Предложение Криса Б об определении нового слота, передающего отправителя в качестве параметра, немного сложнее, но чище с точки зрения структуры программы и разделения между классами. Я склонен использовать этот метод, когда целевой слот находится в другом объекте. Для сопоставления внутри приватного слота класса, sender() является и аккуратным, и вполне подходящим, IMO.
Вот небольшое приложение, демонстрирующее одно из возможных решений:
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_()
Пожалуйста, наслаждайтесь :)