Qt probleempje

Examenroosters, algemene discussies, ...

Moderator: Praesidium

User avatar
Robbe
WOZ
Posts: 2161
Contact:

Qt probleempje

Post#1 » Tue Apr 07, 2009 4:31 pm

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 ;)
"I'm not afraid of falling, I'm afraid of landing" -- Sam
How To Ask Questions The Smart Way

Zingen? UKA-n dat ook!

User avatar
VFlicka
WOZ
Posts: 488

Re: Qt probleempje

Post#2 » Tue Apr 07, 2009 8:23 pm

Robbe wrote: bool verbonden = connect(pman,SIGNAL(newPeer(Peer* )),
SLOT(onNewPeer(Peer* )));
3e parameter vergeten?

User avatar
Robbe
WOZ
Posts: 2161
Contact:

Re: Qt probleempje

Post#3 » Tue Apr 07, 2009 8:42 pm

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.
"I'm not afraid of falling, I'm afraid of landing" -- Sam
How To Ask Questions The Smart Way

Zingen? UKA-n dat ook!

User avatar
Tom
Posts: 602

Post#4 » Wed Apr 08, 2009 9:58 pm

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... ;-)

User avatar
Robbe
WOZ
Posts: 2161
Contact:

Post#5 » Wed Apr 08, 2009 11:19 pm

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?
"I'm not afraid of falling, I'm afraid of landing" -- Sam
How To Ask Questions The Smart Way

Zingen? UKA-n dat ook!

User avatar
Tom
Posts: 602

Post#6 » Thu Apr 09, 2009 12:24 am

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?

Return to “Algemeen”

Who is online

Users browsing this forum: No registered users and 36 guests