Python无法使连接到类函数的信号工作
大家好,我正在制作这个小项目,我需要将一个按钮连接到一个方法,该方法将设置一个特定的帧(存储在列表中)作为QMainWindow的中心小部件,我调用了两次方法nuevaEscena()来创建两个场景(创建了两个帧),这是我尝试的,但当我单击按钮“Escena#”似乎信号没有显示,放置了一个要检查的打印,单击按钮时它不会打印任何内容,它只在调用nuevaEscena()时打印,而且我不确定显示帧的方式是否正确,谢谢下面的代码:Python无法使连接到类函数的信号工作,python,list,pyqt,Python,List,Pyqt,大家好,我正在制作这个小项目,我需要将一个按钮连接到一个方法,该方法将设置一个特定的帧(存储在列表中)作为QMainWindow的中心小部件,我调用了两次方法nuevaEscena()来创建两个场景(创建了两个帧),这是我尝试的,但当我单击按钮“Escena#”似乎信号没有显示,放置了一个要检查的打印,单击按钮时它不会打印任何内容,它只在调用nuevaEscena()时打印,而且我不确定显示帧的方式是否正确,谢谢下面的代码: import sys import sip from PyQt4.Qt
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函数,否则将调用该方法并传递结果对象
单击
时使用此绑定
比使用带有信号的连接要简单得多您应该只粘贴与问题相关的代码部分