[PyQt] connect and "TypeError: argument 1 of QObject.connect() has an invalid type"

Jason H scorp1us at yahoo.com
Mon Oct 19 23:21:57 BST 2009


Easy. Items aren't QObjects.

You need to use QGraphicsObject from Qt 4.6, QGraphicsWidget for 4.5, or make your own proxy for graphics Items. 



----- Original Message ----
From: Thierry Leurent <thierry.leurent at asgardian.be>
To: pyqt at riverbankcomputing.com
Sent: Mon, October 19, 2009 5:17:47 PM
Subject: [PyQt] connect and "TypeError: argument 1 of QObject.connect() has an invalid type"

Hello,

I'm working on small application that will display the map of a network.

The main window have a QListWidget and a QGraphicScene. I create a number of 
object (hosts) in each main widget. When  I select an hosts in the 
QGraphicScene, I would like select the host in  the QListWidget too.
I try different solution to implement signal but that don't work.

I have this kind of message :
  File "./ANetworkMapper.py", line 240, in addItem
    self.connect(item, QtCore.SIGNAL("hostSelected"),self.hostSelected)
TypeError: argument 1 of QObject.connect() has an invalid type


Thanks

Thierry

the code

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# testdraw.py

import sys
from PyQt4 import QtCore, QtGui


class MainWindow(QtGui.QMainWindow):
    def __init__(self, parent=None):
        QtGui.QMainWindow.__init__(self, parent)
    self.setGeometry(300, 300, 1000, 550)
        self.setWindowTitle(self.tr("Asgardian.be's Network Mapper"))
        self.setupActions()
        self.setupMenus()

    self.setupFrame()

        self.statusbar = self.statusBar()
    self.connect(self, QtCore.SIGNAL("messageToStatusbar(QString)"), 
self.statusbar, QtCore.SLOT("showMessage(QString)"))
    self.emit(QtCore.SIGNAL("messageToStatusbar(QString)"), "On the road again")

        self.LoadNetworkMap()

    def setupFrame(self):

    frame = QtGui.QFrame()

        self.networkmap = NetworkMapScene(self)
        self.networkmap.setSceneRect(QtCore.QRectF(0, 0, 5000, 5000))
              
    self.hostsList = NodesList()

#QtCore.QObject.connect(a, QtCore.SIGNAL("QtSig()"), pyFunction)
#QtCore.QObject.connect(a, QtCore.SIGNAL("QtSig()"), pyClass.pyMethod)
#QtCore.QObject.connect(a, QtCore.SIGNAL("QtSig()"), QtCore.SLOT("QtSlot()"))
#QtCore.QObject.connect(a, QtCore.SIGNAL("PySig()"), QtCore.SLOT("QtSlot()"))
#QtCore.QObject.connect(a, QtCore.SIGNAL("PySig"), pyFunction)
    
    self.connect(self.hostsList, 
QtCore.SIGNAL("itemClicked(QListWidgetItem*)"),self.listItemClicked)
    self.connect(self.networkmap, 
QtCore.SIGNAL("hostSelected"),self.hostSelected)
    layout = QtGui.QHBoxLayout(frame)
    
    
    layout.addWidget(self.hostsList)
        
    self.view = QtGui.QGraphicsView(self.networkmap)
        self.view.setRenderHints(QtGui.QPainter.Antialiasing)
        layout.addWidget(self.view)


    self.setCentralWidget(frame)

    def about(self):
        QtGui.QMessageBox.about(self, ("About ANetworkMapper"),
                        ("The <b>Asgerdian.be's Network Mapper</b> is build to 
help you to make the map of your network."))

    def setupActions(self):
        aboutAction = QtGui.QAction("A&bout", self)
        aboutAction.setShortcut("Ctrl+B")
        self.connect(aboutAction, QtCore.SIGNAL("triggered()"),
                self.about)
        self.aboutAction = aboutAction

    def setupMenus(self):
    fileMenu = self.menuBar().addMenu(self.tr("&File"))
        exitAction = fileMenu.addAction(self.tr("E&xit"))
        exitAction.setShortcut(QtGui.QKeySequence(self.tr("Ctrl+Q")))
        self.connect(exitAction, QtCore.SIGNAL("triggered()"), QtGui.qApp, 
QtCore.SLOT("quit()"))
        self.aboutMenu = self.menuBar().addMenu("&Help")
        self.aboutMenu.addAction(self.aboutAction)


    def LoadNetworkMap(self):

    ServerOne=NetworkHost("ServerOne",["Dell", "PowerEdge1900", "Server", 
"Debian", "5.0"] ,200,150,None,self.networkmap)
    ServerOne.add2List(self.hostsList)
    self.networkmap.addItem(ServerOne)
    #self.networkmap(ServerOne, QtCore.SIGNAL("hostSelected"),self.hostSelected)
    #ServerOne.setPixmap(str("./images/debian.png"))

    ServerTwo=NetworkHost("ServerTwo",["Dell", "PowerEdge2600", "Server", 
"RedHat", "5.3"] ,50,100,None,self.networkmap)
    ServerTwo.add2List(self.hostsList)
    self.networkmap.addItem(ServerTwo)             
    
    ServerThree=NetworkHost("ServerThree",["Dell", "PowerEdge2600", "Server", 
"Debian", "Sid"] ,100,150,None,self.networkmap)
    ServerThree.add2List(self.hostsList)
    self.networkmap.addItem(ServerThree)             
    
    ServerFour=NetworkHost("ServerFour",["HP", "Proliant", "Server", "Windows", 
"2003"] ,50,200,None,self.networkmap)
    ServerFour.add2List(self.hostsList)
    self.networkmap.addItem(ServerFour)             

    ServerFive=NetworkHost("ServerFive",["HP", "Proliant", "Server", "Windows", 
"2003"] ,1500,2000,None,self.networkmap)
    ServerFive.add2List(self.hostsList)
    self.networkmap.addItem(ServerFive)             
    

    self.view.show()

    
    for networkthostitem in self.networkmap.items():
      X=networkthostitem.x()
      Y=networkthostitem.y()
      print X, " ", Y, " ", networkthostitem.toolTip()
      print "\n"

    def listItemClicked(self,listItem):
    viewHorizontalScrollBar=self.view.horizontalScrollBar()
    visibleLeft=viewHorizontalScrollBar.value()
    viewVerticalScrollBar=self.view.verticalScrollBar()
    visibleTop=viewVerticalScrollBar.value()
    viewViewport=self.view.viewport()
    viewViewportRect=viewViewport.rect()
    viewViewportRectBottomRight=viewViewportRect.bottomRight()    
    visibleLength=viewViewportRectBottomRight.x()
    visibleHeigth=viewViewportRectBottomRight.y()

    for networkthostitem in self.networkmap.items():
      if (listItem.text() == networkthostitem.getName()):
         print "   ", networkthostitem.getName(), "\n"
         print "   ", networkthostitem.isVisible(), "\n"
         networkthostitem.setFocus()
         networkthostitem.setSelected(True)
         if (networkthostitem.x() <= visibleLeft) or (networkthostitem.x() >= 
(visibleLeft + visibleLength)) or (networkthostitem.y() <= visibleTop) or 
(networkthostitem.y() >= (visibleTop + visibleHeigth)):
          networkthostitem.ensureVisible(0,0,200,200)
        
      else:
         networkthostitem.setSelected(False    )

    def hostSelected(self):
    print "hostslected\n"
class NodesList(QtGui.QListWidget):    
    def __init__(self, parent=None):
    QtGui.QListWidget.__init__(self, parent)
        self.setDragEnabled(True)
        self.setViewMode(QtGui.QListView.ListMode)
        self.setMovement(QtGui.QListView.Snap)
        self.setAcceptDrops(True)
        self.setDropIndicatorShown(True)

    def setCurrentItem(self,host):
    QtGui.QListWidget.setCurrentItem(self,host)
    
class NetworkHost(QtGui.QGraphicsPixmapItem):
    HostName=""
    HostProducer=""
    HostModel=""
    HostType=""
    HostOS=""
    HostOSVersion=""
    X=0
    Y=0

    PixmapItem=None
    ListWidgetItem=None
    HostsList=None

    def __init__(self, name, hostinformations,x, y, parent=None, scene=None):
    QtGui.QGraphicsPixmapItem.__init__(self, parent, scene)
    self.setFlag(QtGui.QGraphicsItem.ItemIsMovable, True)
    self.setFlag(QtGui.QGraphicsItem.ItemIsSelectable, True)
    self.setFlag(QtGui.QGraphicsItem.ItemIsFocusable, True)
    self.HostName=name
    self.HostProducer=hostinformations[0]
    self.HostModel=hostinformations[1]
    self.HostType=hostinformations[2]
    self.HostOS=hostinformations[3]
    self.HostOSVersion=hostinformations[4]

    self.setToolTip(self.HostName)
        self.X=x
    self.Y=y
    self.setPos(x,y)

    self.PixmapItem=QtGui.QPixmap()
    self.PixmapItem.load(self.choosePixmap(self.HostProducer, self.HostModel, 
self.HostType, self.HostOS, self.HostOSVersion))
        QtGui.QGraphicsPixmapItem.setPixmap(self,self.PixmapItem)
      
    def x(self):
    return self.X

    def y(self):
    return self.Y

    def setPixmap (self,PixmapFile):
    self.PixmapItem.load(str(PixmapFile))
    QtGui.QGraphicsPixmapItem.setPixmap(self,self.PixmapItem)    

    def choosePixmap(self, HostProducer, HostModel, HostType, HostOS, 
HostOSVersion):
    if HostOS=="Debian":
       return(str("./images/debian.png"))
    elif HostOS=="RedHat":
       return(str("./images/redhat.png"))
    elif HostOS=="Windows":
       return(str("./images/windows.png"))
    else:
       return(str("./images/qt-logo.png"))

    def add2List(self, hostslist):
    self.ListWidgetItem=QtGui.QListWidgetItem(self.HostName, hostslist)
    
    def setFocusInList(self, hostsList):
    QtGui.QListWidget.setCurrentItem(hostsList,self.ListWidgetItem)

    def mousePressEvent(self, mouseEvent):
    print "NetworkHost :mousePressEvent\n"
    print "--- ", self.getName(),"\n"
    self.scene.setListSelectedItem(self.getName())
    self.emit(QtCore.SIGNAL("hostSelected"))
    #self.emit(SIGNAL("hostSelected"))
    #self.emit(QtCore.SIGNAL("hostSelected(QGraphicsPixmapItem*)"), self)
        #if (mouseEvent.button() != QtCore.Qt.LeftButton):
        #    return
        QtGui.QGraphicsPixmapItem.mousePressEvent(self, mouseEvent)

    def getName(self):
    return self.HostName

class NetworkMapScene(QtGui.QGraphicsScene):
    InsertItem, InsertLine, InsertText, MoveItem  = range(4)

    def __init__(self, itemMenu, parent=None):
        QtGui.QGraphicsScene.__init__(self, parent)

        self.myItemMenu = itemMenu
        self.myMode = self.MoveItem

        self.line = None
        self.textItem = None
        self.myItemColor = QtCore.Qt.white
        self.myTextColor = QtCore.Qt.black
        self.myLineColor = QtCore.Qt.black
        self.myFont = QtGui.QFont()
    
    def addItem(self, item):
      print "---- ", item, "\n"
      print "---- ", item.getName(),"\n"
      self.connect(item, QtCore.SIGNAL("hostSelected"),self.hostSelected)
      QtGui.QGraphicsScene.addItem (self, item)
    def setListSelectedItem(self, itemName):
    print "setListSelectedItem ", itemName,"\n"
    def mousePressEvent(self, mouseEvent):
    print "NetworkMapScene :mousePressEvent\n"
    for networkthostitem in self.items():
      print ">> ",networkthostitem.getName()," ",networkthostitem.isSelected()," 
",networkthostitem.hasFocus(),"\n"
      #if (networkthostitem.isSelected() == True):
        #print "-- ",networkthostitem.getName(),"\n"
    self.emit(QtCore.SIGNAL("hostSelected"))
        #if (mouseEvent.button() != QtCore.Qt.LeftButton):
        #    return
        QtGui.QGraphicsScene.mousePressEvent(self, mouseEvent)
    def hostSelected(self):
    print "NetworkMapScene :hostSelected\n"
if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

_______________________________________________
PyQt mailing list    PyQt at riverbankcomputing.com
http://www.riverbankcomputing.com/mailman/listinfo/pyqt



      


More information about the PyQt mailing list