7

一度に 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?

def(btnclick) に記載されているとおりです。

4

4 に答える 4

3

スロットにいるときは、sender() メソッドを使用できます (self.sender() を呼び出すだけです)。シグナルが送信されたオブジェクトへの参照を受け取ります。ここにそれに関するドキュメントがあります。

于 2010-01-27T11:57:35.630 に答える
2

QPushButton自分の送信者とスロットをサブクラス化して定義します。そのQObject.sender()方法は魅力的ですが、それは私にheebie-jeebiesを与えます。

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)

これを行うもう少しPythonicな方法では、次のようにクラス内の動作を定義できます。

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)
于 2010-02-18T21:14:03.897 に答える
1

gruszcsyが言ったように、自己があります。その正確な情報を取得するためのsender()(QObject内)。

複数の信号送信者から1つのスロットへの高レベルのマッピングを提供するQSignalMapperクラスもあります。これは、多対1の信号/スロットマッピングの基本的なケースに役立ちます。

送信者をパラメーターとして送信する新しいスロットを定義することについてのChrisBの提案は、もう少し複雑ですが、プログラム構造とクラス間の分離の点でよりクリーンです。ターゲットスロットが別のオブジェクトにある場合、私はそのメソッドを使用する傾向があります。クラスのプライベートスロット内のマッピングには、sender()が適切であり、非常に適切です(IMO)。

于 2010-02-18T21:26:15.593 に答える
0

考えられる解決策の1つを示す小さなアプリを次に示します。

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_()

楽しんでください :)

于 2010-02-19T17:58:43.260 に答える