2013-04-01 26 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結合比使用與信號連接