Sziasztok!
Qt-ben szeretném megvalósítani, hogy egy szignál hatására lekérjem 3 QLineEdit tartalmát, és azt egy slotnak átadjam paraméterül.pl.:
connect(ui->addbutton, SIGNAL(clicked()), &dataBase, SLOT(add(QString elsoTartalma, QString masodikTartalma, QString harmadikTartalma)));
Gondoltam olyanra is, hogy a dataBase-nek lenne egy void add() függvénye, ami lekéri a fent említett három QLineEdit tartalmát, de ez szerintem elég csúnya megoldás lenne, nem tudnám más környezetben használni az adott slotot.
A válaszokat előre is köszönöm.
Üdv,
Tibi
- 7123 megtekintés
Hozzászólások
Bocs, mi a kérdés?
- A hozzászóláshoz be kell jelentkezni
A kérdés: Hogyan lehet azt megoldani, hogyha az adott gombra rákattintok, a három QLineEdit tartalmát lekérjem, és azt átadjam a slotnak. Lehet nagyon egyszerű, de két napja használom csak a Qt-t, önszorgalomból, úgyhogy van még hova fejlődnöm :)
- A hozzászóláshoz be kell jelentkezni
connect(ui->addbutton, SIGNAL(clicked()), &dataBase, SLOT(add(LineEdit1->text, LineEdit2->text, LineEdit3->text)));
Ilyesmire gondolsz? A signal - slot függvényeknek ugyanúgy adhatsz át paraméteket, mint bármi másnak.
- A hozzászóláshoz be kell jelentkezni
Igen, ilyesmire gondoltam, köszönöm :) Ez a megoldás eszembe sem jutott, de így kezd tisztulni a kép :)
- A hozzászóláshoz be kell jelentkezni
Lehet, hogy hülyeséget mondtam, mert a gyakorlatban ez nem akar működni...
- A hozzászóláshoz be kell jelentkezni
Beírtam én is, és nem ismer ilyen slotot:
Object::connect: No such slot ClientDB::add(ui->groupName->text())
Pedig van:
void ClientDb::add(const QString&);
így néz ki a prototípusa.
- A hozzászóláshoz be kell jelentkezni
Csodálkoztam is, amikor leírtad, hogy ez így megy de nem akartam beleszólni.
A signal-slot paramétereknek illik egyezni, hogy jól működjön a rendszer.
Az alábbi
connect(ui->addbutton, SIGNAL(clicked()), &dataBase, SLOT(add(LineEdit1->text, LineEdit2->text, LineEdit3->text)));
helyett csinálsz egy void add3LineEdit(void) slot ot, ekkor használod ezt:
connect(ui->addbutton, SIGNAL(clicked()), &dataBase, SLOT(add3LineEdit())));
És a add3LineEdit(void) -ba belerakod a add(LineEdit1->text, LineEdit2->text, LineEdit3->text); -t
- A hozzászóláshoz be kell jelentkezni
Így gondoltad?
void ClientDB::add3LineEdit() {
add(LineEdit1->text, LineEdit2->text, LineEdit3->text);
}
Itt az a baj, hogy nem látja az add() függvény LineEdit-eket, mert a GUI és a ClientDB (ennek e példánya a dataBase) külön osztály.
- A hozzászóláshoz be kell jelentkezni
Nyert!
Ha ilyen gondok vannak azt meg kell oldani valahogy. Számtalan lehetőséged van.
Egyik hogy a gui osztályba rakod a slot-ot pl vagy abba az osztályba ahonnan ezt a connect-et hívtad.
Vagy ha mindenképp ezt ad add slot-ot akarod használni csinálsz hozzá egy signalt ami a 3 LineEdit tartalmát passzolja tovább:
//h-ban
class GuiClass {
...
slots:
void clickAdd3Line(void);
signals:
void clickSignal3Line(QString a,QString b,QString c);
...
//C++ fajlban
void GuiClass::clickAdd3Line(void)
{
emit clickSignal3Line(LineEdit1->text, LineEdit2->text, LineEdit3->text);
}
És akkor
connect(ui->addbutton, SIGNAL(clicked()), ui, SLOT(clickAdd3Line())));
connect(ui, SIGNAL(clickSignal3Line(QString,QString,QString)),
&dataBase, SLOT(add(QString,QString,QString))));
- A hozzászóláshoz be kell jelentkezni
Ne haragudjatok, tisztelem a segítő szándékot, de ez egyre rosszabb lesz. Se nem szép, se nem érthető (a kérdezőnek szintjén tuti nem), se nem működő. Keressünk valami elegáns megoldást!
Első tipp, egy SIGNALt tetszőleges számú SLOThoz hozzácsatolhatsz.
connect (ui->gombod, SIGNAL (clicked()), akármi, SLOT(csinálja()));
connect (ui->gombod, SIGNAL (clicked()), valamimás, SLOT(tegyenvalamimást()));
Általánosságban mondom, bár mostanában nem gyötörtem a Qt-ét, de ha nem csal még az emlékezetem, akkor olyan van, hogy egy SIGNALnak több paramétere van mint a SLOTnak, vagy ugyanannyi, de fordítva tutira nem.
Végül, hogy a SLOTban meghívott random függvény lássa a QLineEditeket és a valamilyen dataBase nevű dolgot, igazán nem nagy dolog, ha ennek az átlátása gondot okoz, akkor javaslom egy lépést menjünk vissza és tárgyaljuk át hogy hogyan is néz ez most ki.
- A hozzászóláshoz be kell jelentkezni
Már több megoldás is érkezett, de egyik sem jó? Látom nem egyszerű a kérdésem :)
Jelenleg kezdésként olyan programot akarok írni Qt-ben amiben számítógépek adatait tudom eltárolni. Az xml kezelést DOM-al már megírtam. Egy számítógépnél eltárolom a nevét, az IP címét és a portját. Később majd egyszerű menedzsment szoftverré akarom bővíteni, pl. kikapcsolja a gépet, snapshot csinál az asztalról, stb. Egyelőre ebből most csak annyit szeretnék megvalósítani, hogy egy egyszerű ablakban be lehessen írni a gép nevét, az IP címét és a portját. A név az csak a használhatóság miatt kell.
Mint említettem, már tudok xml- fájlból ilyen klienseket betölteni, elmenteni, a DOM-hoz hozzáadni, törölni. Vannak csoportjaim is, hogy össze tudjam őket vonni, ezeket is lehet törölni stb... Ez a ClientDB osztályom.
A MainWindow-t Qt Designerrel csináltam, csak az említett QLineEdit-ek és Add/Remove/Quit stb... gombok vannak rajta.
Itt az Add gombhoz szeretném hozzákapcsolni azt a funkciót, ami kiolvassa a QLineEdit-ek tartalmát és hozzáadja az adatbázishoz.
Jelenleg ennyit szeretnék. Ha a main() függvényben hozok létre egy példányt a MainWindow-ból és a ClientDB-ből, ezeket össze tudom ott kapcsolni? Talán az lenne a legjobb.
- A hozzászóláshoz be kell jelentkezni
A fentiekből úgy szűrtem le - lehet tévesen - hogy még elég sok alapozási hiányosság van. Ha komolyan gondolod, akkor javaslom, hogy egy-két tutorial erejéig kezdj neki a példaprogramoknak, szigorúan Designer nélkül. Én azthiszem, hogy a Qt könyv első 2-3 fejezete után világos lesz, hogy normális esetben hogyan férsz hozzá a különböző GUI elemekhez könnyedén, nem kell kacifántos SIGNAL-SLOT rendszer, jelen esetben a clicked() SIGNALt elkapod egy MainWindowba implementált függvénnyel, és azon belül szépen eléred az adatbázist is, a QLineEditeket is, stb ha azok jó helyen vannak implementálva.
Nem kell semmi huncutság, de ez annyira alapvetés, hogy ezt biztos tudással át kell látnod. Még ha esetleg C++ban gyakorlott is vagy, ha megtanulod a Qt módszert, gyorsan és hatékonyan tudod majd használni.
Ha viszont nem akarsz ebbe energiát ölni, csak működjön, akkor valamit összekalapálunk :)
- A hozzászóláshoz be kell jelentkezni
Erre a könyvre gondolsz:
http://developer.qt.nokia.com/books/view/c_gui_programming_with_qt_4_2n…
?
Szép kódot szeretnék, arra már rájöttem, hogy az ész nélküli kódolásnak nincs értelme. Java-ban Swing GUI-t csináltam már kézzel, az alapok így megvannak. A c++ al sincs gondom, ő most a "kedvenc". Írtam már benne egy barátommal egy BigInt osztályt is.
- A hozzászóláshoz be kell jelentkezni
Igen, ez teljesen jó lesz és tényleg nem kell végigolvasnod a könyvet, az első néhány fejezetben biztos vagyok benne hogy az alapok világossá válnak és a fenti problémát simán orvosolod. Ha pedig kérdésed van, továbbra is sok szeretettel várunk a fórumon.
- A hozzászóláshoz be kell jelentkezni
A problémád megoldásához ezt kellene végigfutnod http://developer.qt.nokia.com/doc/qt-4.8/designer-using-a-ui-file.html
- A hozzászóláshoz be kell jelentkezni
Köszönöm, ezeket elolvasom.
- A hozzászóláshoz be kell jelentkezni
dii:
Már bocsánat, de te mit hordasz itt össze? A szubjektív szépségérzet egy dolog, de hogy ez működik az biztos. Az, hogy a kérdező nem tudja beletenni a gui osztályába, mert még nem nézte át hogy a designeres dolgokat hogyan lehet felhasználni a kódban egy dolog. Nem a fent leírt kód hibája.
(Mellesleg lejjebb ugyanezt mondod neki, csak a db felé te függvenyhívast emlegetsz és nem signal-t)
Annál is inkább a fenti megoldás a nyerő ugyanis így a slot függvenybe be tud rakni pár ellenőrzést is a gui elemekre vonatkozóan. (Nem üresek-e a LineEditek, stb) És ezt ugye jobb lenne a gui ba rakni, hogy a hibajelzések onnan induljanak, és nem a db- ben matekolni, hogy mi történt amikor 3 üres QString-et kaptam.
Na de mind1, én leírtam egy megoldást ami működik, tovább nem reszelem itt a dolgot.
- A hozzászóláshoz be kell jelentkezni
Summáztam a szálat, az előtted lévő hozzászólásokban nem volt olyan ami működne is. A tiédben pedig minden valószínűség szerint teljesen feleslegesen vezettél be egy új signalt, ezzel egy kicsit még jobban beküldve az erdőbe a kérdezőt. Holott a probléma, ahogy rámutattál, hogy nem jól érti a gui objektumok kezelését még. Erre céloztam, nem a kódolási önérzetet akartam bántani, elnézést kérek.
- A hozzászóláshoz be kell jelentkezni
ok. Ezzel egyetértek.
A signal azert lett bevezetve, mert eredetileg a kérdező ezzel a módszerrel akarta az adatbázis "add" slotját használni.
- A hozzászóláshoz be kell jelentkezni
Anélkül, hogy sok tapasztalatom lenne ezen a téren, nekem a józan ész azt diktálná, hogy csináljak egy addEntryClicked eseményt (slotot) a gombhoz a formban implementálva, a dataBase objektumnak pedig egy általános addEntry metódust, amit megfelelően felparaméterezve meghívok az addEntryClicked-ből (ha nincs több réteg). A dataBase-nek semmiképp nem kéne tudnia a ui-ról, de attól függően, hogy hova kerül a vezérlés, egyszerűbb appnál a formból nyilván nyugodtan meghívhatod a dataBase metódusát.
-szobi.
- A hozzászóláshoz be kell jelentkezni