Python无法使连接到类函数的信号工作

Python无法使连接到类函数的信号工作,python,list,pyqt,Python,List,Pyqt,大家好,我正在制作这个小项目,我需要将一个按钮连接到一个方法,该方法将设置一个特定的帧(存储在列表中)作为QMainWindow的中心小部件,我调用了两次方法nuevaEscena()来创建两个场景(创建了两个帧),这是我尝试的,但当我单击按钮“Escena#”似乎信号没有显示,放置了一个要检查的打印,单击按钮时它不会打印任何内容,它只在调用nuevaEscena()时打印,而且我不确定显示帧的方式是否正确,谢谢下面的代码: import sys import sip from PyQt4.Qt

大家好,我正在制作这个小项目,我需要将一个按钮连接到一个方法,该方法将设置一个特定的帧(存储在列表中)作为QMainWindow的中心小部件,我调用了两次方法nuevaEscena()来创建两个场景(创建了两个帧),这是我尝试的,但当我单击按钮“Escena#”似乎信号没有显示,放置了一个要检查的打印,单击按钮时它不会打印任何内容,它只在调用nuevaEscena()时打印,而且我不确定显示帧的方式是否正确,谢谢下面的代码:

import sys
import sip
from PyQt4.QtCore import *
from PyQt4.QtGui import *
#from blurdev.gui import Dialog
# from Py3dsMax import mxs

myMimeType = 'application/MyWindow'

class MyLabel(QLabel):
    def __init__(self, parent):
        super(MyLabel, self).__init__(parent)
        self.setStyleSheet("background-image: url(selector.png);")
        self.adjustSize()
    def mouseMoveEvent(self, e):
        if e.buttons() != Qt.LeftButton:
            return

        # write the relative cursor position to mime data
        mimeData = QMimeData()
        # simple string with 'x,y'
        mimeData.setText('%d,%d' % (e.x(), e.y()))
        # start the drag operation
        # exec_ will return the accepted action from dropEvent
        if drag.exec_(Qt.MoveAction | Qt.CopyAction) == Qt.MoveAction:
            self.show()



    def mousePressEvent(self, event):
        itemData   = QByteArray()
        dataStream = QDataStream(itemData, QIODevice.WriteOnly)
        dataStream.writeString(self.text())
        dataStream << QPoint(event.pos() - self.rect().topLeft())

        mimeData = QMimeData()
        mimeData.setData(myMimeType, itemData)
        mimeData.setText(self.text())

        drag = QDrag(self)
        drag.setMimeData(mimeData)
        drag.setHotSpot(event.pos() - self.rect().topLeft())

        #self.hide()
        # mxs.select(mxs.getNodeByName('a'))
        if drag.exec_(Qt.MoveAction | Qt.CopyAction) == Qt.MoveAction:
            self.close()
        else:
            self.show()


class MyFrame(QFrame):
    def __init__(self, parent=None):
        super(MyFrame, self).__init__(parent)
        self.setStyleSheet("background-image: url(logo.png);")
        self.setFixedSize(800,600)
        y = 6

        for labelNumber in range(6):
            label = MyLabel(self)
            label.resize(50, 50)
            label.move(6, y)
            label.show()
            y += label.height() + 2

        self.setAcceptDrops(True)

    def dragEnterEvent(self, event):
        if event.mimeData().hasFormat(myMimeType):
            if event.source() in self.children():
                event.setDropAction(Qt.MoveAction)
                event.accept()
            else:
                event.acceptProposedAction()

    def dropEvent(self, event):
        if event.mimeData().hasFormat(myMimeType):
            mime       = event.mimeData()
            itemData   = mime.data(myMimeType)
            dataStream = QDataStream(itemData, QIODevice.ReadOnly)

            text = QByteArray()
            offset = QPoint()
            dataStream >> text >> offset

            newLabel = MyLabel(self)
            newLabel.setText(event.mimeData().text())
            newLabel.move(event.pos() - offset)
            newLabel.resize(50, 50)
            newLabel.show()

            if event.source() in self.children():
                event.setDropAction(Qt.MoveAction)
                event.accept()

            else:
                event.acceptProposedAction()

        #~ else:
            #~ event.ignore()

class MyWindow(QMainWindow):
    def __init__(self, parent=None):
        super(MyWindow, self).__init__(parent)
        self.move(app.desktop().screen().rect().center() - self.rect().center())
        self.crearPanelEscenas()
        self.crearMenus()
        self.nuevaEscena()
        self.nuevaEscena()

    #GUI Interfaces
    def crearPanelEscenas(self):
        # Lista de escenas
        self.listaEscenas = []
        # Escena actual
        self.escenaActual = -1;
        # Panel para los botones de escenas
        self.listaEscenasGUI = QDockWidget("Escenas")
        self.listaEscenasGUI.setFeatures(QDockWidget.NoDockWidgetFeatures)

        dockWidget = QWidget()
        dockWidgetLayout = QHBoxLayout()
        dockWidget.setLayout(dockWidgetLayout)

        self.listaEscenasGUI.setWidget(dockWidget)
        self.addDockWidget(Qt.TopDockWidgetArea, self.listaEscenasGUI)

    def nuevaEscena(self):
        self.escenaActual = self.escenaActual + 1;
        # Button para seleccionar escena a ver
        myButton = QPushButton("Escena "+str(self.escenaActual))
        self.listaEscenasGUI.widget().layout().addWidget(myButton)
        # Creo la escena nueva
        nuevaEscena = MyFrame() 
        # La guardo             
        self.listaEscenas.append(nuevaEscena)   
        self.connect(myButton, SIGNAL("clicked()"), SLOT(self.mostrarEscena(self.escenaActual)))

    def mostrarEscena(self, index):
        print "Clicked"
        self.escenaActual = index
        self.setCentralWidget(self.listaEscenas[index])

    #GUI Menus
    def crearMenus(self):
        self.menuBar = self.menuBar()
        adicionarAction = QAction("Adicionar",self.menuBar)
        eliminarAction = QAction("Eliminar",self.menuBar)

        self.menuArchivo  = self.menuBar.addMenu("&Archivo")
        self.menuInterfaz = self.menuBar.addMenu("&Interfaz")

        self.menuInterfaz.addAction(adicionarAction)
        self.menuInterfaz.addAction(eliminarAction)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    app.setApplicationName('GUI Picker')
    main = MyWindow()
    main.show()
    sys.exit(app.exec_())
导入系统 进口sip 从PyQt4.QtCore导入* 从PyQt4.QtGui导入* #从blurdev.gui导入对话框 #从Py3dsMax导入mxs myMimeType='应用程序/MyWindow' 类MyLabel(QLabel): 定义初始化(自身,父级): 超级(MyLabel,self)。\uuuuu初始化\uuuuuu(父级) self.setStyleSheet(“背景图像:url(selector.png);”) self.adjustSize() def mouseMoveEvent(自身,e): 如果e.按钮()!=Qt.LeftButton: 返回 #将相对光标位置写入mime数据 mimeData=QMimeData() #带“x,y”的简单字符串 mimeData.setText(“%d,%d%”(e.x(),e.y()) #开始拖动操作 #exec_uu将从dropEvent返回已接受的操作 如果drag.exec(Qt.MoveAction | Qt.CopyAction)==Qt.MoveAction: self.show() def鼠标压力事件(自身、事件): itemData=QByteArray() dataStream=QDataStream(itemData,QIODevice.WriteOnly) dataStream.writeString(self.text()) 数据流>文本>>偏移量 newLabel=MyLabel(自) newLabel.setText(event.mimeData().text()) newLabel.move(event.pos()-offset) 新建标签。调整大小(50,50) newLabel.show() 如果self.children()中的event.source()为: event.setDropAction(Qt.MoveAction) event.accept() 其他: event.acceptProposeAction() #~else: #~event.ignore() 类MyWindow(QMainWindow): def uuu init uuu(self,parent=None): 超级(MyWindow,self)。\uuuuu init\uuuuuu(父级) self.move(app.desktop().screen().rect().center()-self.rect().center()) self.crearPanelEscenas() self.crearMenus() self.nuevaEscena() self.nuevaEscena() #图形用户界面 def crearPanelEscenas(自身): #艾斯凯纳斯酒店 self.listaEscenas=[] #伊塞纳实际值 self.escenaActual=-1; #埃斯凯纳斯波通酒店 self.listaEscenasGUI=QDockWidget(“Escenas”) self.listaEscenasGUI.setFeatures(QDockWidget.NoDockWidgetFeatures) dockWidget=QWidget() dockWidgetLayout=QHBoxLayout() setLayout(dockWidgetLayout) self.listaEscenasGUI.setWidget(dockWidget) self.addDockWidget(Qt.TopDockWidgetArea,self.listaesencenasgui) def nuevaEscena(自身): self.escenaActual=self.escenaActual+1; #按钮参数选择escena a版本 myButton=QPushButton(“Escena”+str(self.escenaActual)) self.listaEscenasGUI.widget().layout().addWidget(myButton) #新伊塞纳酒店 nuevaEscena=MyFrame() #拉瓜多 self.listaEscenas.append(nuevaEscena) self.connect(myButton,信号(“clicked()”),插槽(self.mostrarEscena(self.escenareact))) def mostrarEscena(自身,索引): 打印“单击” self.escenaActual=索引 self.setCentralWidget(self.listaEscenas[index]) #图形用户界面菜单 def crearMenus(自身): self.menuBar=self.menuBar() adicionarAction=QAction(“Adicionar”,self.menuBar) eliminarAction=QAction(“Eliminar”,self.menuBar) self.menuArchivo=self.menuBar.addMenu(“&Archivo”) self.menuInterfaz=self.menuBar.addMenu(“&Interfaz”) self.menuInterfaz.addAction(adicionarAction) self.menuInterfaz.addAction(eliminarAction) 如果名称=“\uuuuu main\uuuuuuuu”: app=QApplication(sys.argv) app.setApplicationName('GUI选取器') main=MyWindow() main.show() sys.exit(app.exec_())
这是您应该做的:

MyButton.clicked.connect(lambda: self.mostrarEscena(self.escenaActual))
您需要一个lambda函数,否则将调用该方法并传递结果对象


单击
时使用此绑定
比使用带有信号的连接要简单得多

您应该只粘贴与问题相关的代码部分