簡體   English   中英

PyQt-具有參數的插槽

[英]PyQt - slots with parameter

例:

我有三個按鈕,所有按鈕幾乎相同。 我只希望所有3個按鈕具有1個插槽功能。

def slotButtons(nr_button):

  #common part

  if(nr==1):
    #for button 1
  else if(nr==2):
    #for button 2
  else if(nr==3):
    #for button 3

  #common part 

所以我需要帶有參數的插槽。

QtCore.QObject.connect(pushButton1, QtCore.SIGNAL("clicked()"), slotButtons(1))
QtCore.QObject.connect(pushButton2, QtCore.SIGNAL("clicked()"), slotButtons(2))
QtCore.QObject.connect(pushButton3, QtCore.SIGNAL("clicked()"), slotButtons(3))

Python(pyQt)可以做些什么嗎?

connect需要的是任何可調用的 Python對象。 由於Python具有作為一等對象的功能,因此使用包裝函數很容易實現。 對於簡單的情況, lambda可以:

    self.connect(pyuic4Button, SIGNAL("clicked()"),
            lambda: self.setPath("pyuic4"))
    self.connect(pyrcc4Button, SIGNAL("clicked()"),
            lambda: self.setPath("pyrcc4"))

您可以使用QObject::sender()函數使每個發送者,對象的行為有所不同,有關詳細信息,請參見QObject文檔

您甚至可以:

lambda value: self.doStuff(True if value==True else False)

一旦弄清楚了它是如何工作的,它就是一個很棒的工具。

編輯:您也可以跳過所有的ifs / else ...就直接指向...-粗略的例子:

btn_01 = lambda: self.doStuff("C://")
btn_02 = lambda: self.doStuff("D://")

def doStuff(self,dir):
     saveFile(dir+"filename.txt")

我不使用PyQt,而是查看QSignalMapper文檔,它應該是相同的。 基本上,它允許您使用參數將來自不同對象的信號映射到插槽。

您可以使用一個成員變量來標識該對象,並執行以下確定的操作。

def slotButtons(btn):
    if btn.who_are_you == 1:
        # Do some stuff
    elif btn.who_are_you == 2:
        # Do some stuff
    elif btn.who_are_you == 3:
        # Do some stuff

    # Common part

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM