Page 1 of 1

Qt probleempje

Posted: Tue Apr 07, 2009 4:31 pm
by Robbe
Ik ben voor Netwerk Protocols met Qt bezig en ik ben een probleem tegengekomen met signals en slots. In de hoop dat er hier een paar verdoken Qt-guru's rondhangen, leg ik het even uit ;)

Ik heb in een al bestaande werkende klasse een slot onNewPeer(Peer*) toegvoegd en in mijn code connect ik dit slot aan een signal newPeer(Peer*). Als ik dan de code compileer en de executable uitvoer, geeft hij een melding dat hij het slot niet kan vinden, meer bepaald:

Code: Select all

Object::connect: No such slot kt::ZeroConfPlugin::onNewPeer(Peer*)
De header voor de betrokken klasse...

Code: Select all

class ZeroConfPlugin : public Plugin
{
Q_OBJECT
public:
ZeroConfPlugin(QObject* parent, const QStringList& args);
virtual ~ZeroConfPlugin();

virtual void load();
virtual void unload();
virtual bool versionCheck(const QString& version) const;

public slots:
void onNewPeer(bt::Peer* p);

private slots:
void torrentAdded(bt::TorrentInterface* tc);
void torrentRemoved(bt::TorrentInterface* tc);
void avahiServiceDestroyed(TorrentService* av);

private:
bt::PtrMap<bt::TorrentInterface*,TorrentService> services;
};
en de enige plaats waar de connect in kwestie gebeurt...

Code: Select all

void ZeroConfPlugin::torrentAdded(bt::TorrentInterface* tc)
{
if (services.contains(tc))
return;
TorrentControl* control = dynamic_cast<TorrentControl*>(tc);
const PeerManager* pman = control->getPeerMgr();
bool verbonden = connect(pman,SIGNAL(newPeer(Peer* )),
SLOT(onNewPeer(Peer* )));
Out(SYS_ZCO|LOG_DEBUG) << "ZeroConf could " << (verbonden?"":"not ") << "connect newPeer to onNewPeer" << endl;

TorrentService* av = new TorrentService(tc);
services.insert(tc,av);
tc->addPeerSource(av);
Out(SYS_ZCO|LOG_NOTICE) << "ZeroConf service added for " << tc->getStats().torrent_name << endl;
connect(av,SIGNAL(serviceDestroyed( TorrentService* )),
this,SLOT(avahiServiceDestroyed( TorrentService* )));
}
Heeft iemand al eens iets gelijkaardig meegemaakt en het opgelost gekregen? Of kan iemand me vertellen waarom de connect niet gedaan word?

Als er iets niet duidelijk is, vraag me gerust om verduidelijking ;)

BTW: de betreffende slot private maken of een andere naam geven heb ik al geprobeerd, geeft net hetzelfde probleem ;)

Re: Qt probleempje

Posted: Tue Apr 07, 2009 8:23 pm
by VFlicka
Robbe wrote: bool verbonden = connect(pman,SIGNAL(newPeer(Peer* )),
SLOT(onNewPeer(Peer* )));
3e parameter vergeten?

Re: Qt probleempje

Posted: Tue Apr 07, 2009 8:42 pm
by Robbe
VFlicka wrote:
Robbe wrote: bool verbonden = connect(pman,SIGNAL(newPeer(Peer* )),
SLOT(onNewPeer(Peer* )));
3e parameter vergeten?
Nope, is een verkorte versie van connect om niet elke keer this te moeten opgeven bij de receiver (bron). Maar ervoor was het de versie met 4 parameters en toen gaf het ook die error at runtime.

Posted: Wed Apr 08, 2009 9:58 pm
by Tom
Heb even rondgeneusd op Stack Overflow en dit gevonden:

http://stackoverflow.com/questions/5778 ... -such-slot

Daar suggereert men de derde parameter anders op te geven bij Python, dat zou er dan ongeveer zo moeten uitzien:

Code: Select all

bool verbonden = connect(pman, SIGNAL(newPeer(Peer* )), &ZeroConfPlugin::onNewPeer));
Als je daar niet mee verder kan raad ik je aan even op Stack Overflow een question te openen... ;-)

Posted: Wed Apr 08, 2009 11:19 pm
by Robbe
Tom wrote:Daar suggereert men de derde parameter anders op te geven bij Python, dat zou er dan ongeveer zo moeten uitzien:

Code: Select all

bool verbonden = connect(pman, SIGNAL(newPeer(Peer* )), &ZeroConfPlugin::onNewPeer));
Python is wel een klein beetje anders dan C++, maar om toch hier op in te gaan: deze connect functie heeft een pointer naar een object en 2 char* velden nodig, iets vertelt me dat een functiepointer alleen maar compilatiefouten gaat geven. Maar toch bedankt voor de moeite, ik zal het zeker eens proberen.

We hebben het ook eens aan de assistent in kwestie gevraagd en die stelde voor van onze vraag op het forum van KTorrent te stellen, aangezien ze daar iets meer weten over het hele KTorrent gebeuren. Als er daar een oplossing uit de bus komt, zal ik ze er hier zeker bij zetten, moest ze tegen dan nog niet gevonden zijn ;)

Kent er hier iemand mensen die wat bekend zijn met Qt by any chance?

Posted: Thu Apr 09, 2009 12:24 am
by Tom
Tussen de bergen puin nog drie dingen gevonden die misschien handig kunnen zijn:

1. No such slot, wrong base class.
2. No such slot - Use type conversion as third parameter
3. QT Threads - Erf je de QObject class over?

Volgens mij is het dit laatste, of wordt deze in een lagere klasse voorzien?