Qt - komunikace mezi třídami – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Qt - komunikace mezi třídami – C / C++ – Fórum – Programujte.comQt - komunikace mezi třídami – C / C++ – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené — příspěvek s řešením.
jaspys0
Duch
31. 3. 2012   #1
-
0
-

Zdravím, chtěl bych vytvořit programy server-client (pro začátek jednoduché zasílání zpráv).

Podle příkladu na stránkách qt (http://doc.qt.nokia.com/4.7-snapshot/network-fortuneserver.html a http://doc.qt.nokia.com/4.7-snapshot/network-fortuneclient.html) mi vše jde, ale jelikož program bude nakonec vykonávat více úkonů, potřeboval bych na toto vlastní třídu. To mi však nejde. Nejde mi předávání signálu uvnitř objektu Client, který si vytvořím v hlavní třídě MainWindow

Vypisování přijaté informace řeším pomocí emit a argumentu signálu, který zachytíMainWindow. Toto mi jde, ale jakmile je vytvořen signál v třídě Client,který má být v této třídě zpracován, nic se neděje.

Bohužel jsem na žádný návod na netu nenarazil.

Mockrát díky za každý tip.

Nahlásit jako SPAM
IP: 84.16.113.–
býval jsem fit, teď jsem jenom FIT
crazy
~ Moderátor
+10
Grafoman
1. 4. 2012   #2
-
0
-

#1 jaspys
ukaž kód (jen ty části, o které ti jde)

Nahlásit jako SPAM
IP: 89.190.90.–
All you need is vision and time.
ingiraxo+15
Grafoman
1. 4. 2012   #3
-
0
-

napiš sem ten kód no... jinak jak vytvoříš instanci klienta, tak musíš connect signal klienta se slotem v mainwindow.. klient může obsahovat nějaký privátní sloty, který se připojujou přímo na soket a tyhle sloty můžou emitovat signal, kterej bude zachytávat mainwindow (pokud to tedy řešíš jako tcp)

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
jaspys0
Duch
1. 4. 2012   #4
-
0
-

   

//mainwindow.cpp
MainWindow {
 Client client
 connect(&client, SIGNAL(zachyceniZpravy(QString)), this, SLOT(zpracuj(QString)));
}

//client.cpp
 class Client... {
 socket = new QTcpSocket();
 connect(socket, SIGNAL(readyRead()), this, readyRead());
 ...
}

void Client::readyRead() {
 ...
 emit zachyceniZprava(zprava);
}

pokud mám ve zdrojáku (velmi zjednodušeno) to, tak mi client žádné signály nezachytává. Pouze se inicializuje, můžu s ním posílat požadavky, ale už žádné neodchytím, protože connect na readyRead()vubec nereaguje. Jde mi o to, kde mám mít ty connecty.

Zkoušel jsem je i v tříděMainWindow

connect(&client.socket, SIGNAL(readyRead()), client, SLOT(readyRead()))

ale žádný efekt. Nemáte spíš nějaký funkční vzorek?

Nahlásit jako SPAM
IP: 212.96.160.–
býval jsem fit, teď jsem jenom FIT
Řešení
ingiraxo+15
Grafoman
1. 4. 2012   #5
-
+1
-
Zajímavé
Vyřešeno Nejlepší odpověď

#4 jaspys
Též uvedu velmi zjednodušeně...  Máš třeba takovou třídu, kde máš 2 sloty, pro čtení zprávy a odpojení klienta + jeho soket

class Client
{
Q_OBJECT

private slots:
    void OnDisconnect();
    void OnReadyRead();

signals:
    void ReadMessage(const QString msg);
    void Disconnect(Client* client);

private:
    QTcpSocket socket;
};

Teď v tělě se připojíš sloty na soket: 

Client::Client()
{
    connect(&socket, SIGNAL(readyRead()), this, SLOT(OnReadyRead()));
    connect(&socket, SIGNAL(disconnect()), this, SLOT(OnDisconnect()));
}

void Client::OnReadyRead()
{
    emit ReadMessage(socket.readAll());
}

void Client::OnDisconnect()
{
    emit Disconnect(this);
}

Chápeš tak nějak? Ty privátní sloty, jsou pouze pro třídu klienta a až spracuje obsah, tak emitne výsledek třeba do třídy Server... veškerej obsah ze soketu se vykonává v této třídě, pokud chceš něco odeslat jinam, tak jedině přes vlastní signál

PS: signál connected() v klientu nedělej, ten slouží pouze pro klientskou stranu, resp. na straně serveru nefunguje, tam se používá překrytá fce v QTcpServer incommingConnection(int)

Potom teda ve tříde Server to může vypadat takto: 

class Server : public QTcpServer
{
Q_OBJECT

private slots:
    void OnRead(const QString msg)
    {
        qDebug() << msg;
    }

protected:
    void incommingConnection(int handle)
    {
        Client* client = new Client(this);
        connect(client, SIGNAL(ReadMessage(QString)), this, SLOT(OnRead(QString)));
    }
};

Podstatě při vytvoření instance klienta, se rovnou připojíš na signaly, který odesílat v parametru info... Psal jsem to tady, takže pokud jsem někdě něco vynechal tak sry :D ale princip je snad jasnej

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
ingiraxo+15
Grafoman
1. 4. 2012   #6
-
+1
-
Zajímavé

samozřejmě pak ještě nastavit handle na soket v incomingConnection(int).. takže v klientu třeba přes konstruktor nebo fci na socketSetDescriptor(int) a koukám, že jsem vynechal konstruktory :D je snad jasný, že předávaj QObject* rodičovský třídě... jinak tohle je celej problém, zkus si to nějak pořešit už

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 13 hostů

Podobná vlákna

Komunikace mezi třídami — založil rich

Signály mezi třídami pyqt — založil František

Předání hodnot mezi třídami — založil roman.jaros

Komunikace mezi pc — založil delete

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý