2013-04-01 29 views
0

嗨,我正在做这个小项目,我需要连接一个按钮到一个方法,将设置一个特定的框架(存储在列表中)作为中心部件一个QMainWindow,我已经调用了两次nuevaEscena()方法创建两个场景(创建了两个帧),这是我尝试过的,但是当我点击按钮“Escena#”时,它看起来像信号没有被消除, ,放置一个打印件进行检查,当按钮被点击时它不会打印任何东西,它只在调用nuevaEscena()时打印,我也不确定我处理的方式是否正确,这里是代码:Python不能使连接信号到类功能工作

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

您应该只将代码粘贴的有关问题的部分简单得多 – JBernardo

回答

0

这是你应该做的:

MyButton.clicked.connect(lambda: self.mostrarEscena(self.escenaActual)) 

您需要一个lambda函数,否则您将调用该方法并改为传递结果对象。

使用这种与clicked结合比使用与信号连接