Új osztály-szintaktika? (KDevelop - Qt)

 ( pelz | 2008. március 14., péntek - 6:20 )

Sziasztok!

Nemrégiben kezdtem el foglalkozni a KDevelop programfejlesztővel, ami a TROLLTECH cég Qt termékén alapul, de ezt biztosan feleslegesen írom, hisz valószínűleg legtöbbetek tudja ezt.
De rátérek a kérdésem lényegére: A program egy új projekt indításakor automatikusan generál egy kis bázis kódot, amiből ki lehet indulni a fejlesztés kezdeti fázisában. Én pl. egy egyszerű alkalmazást generáltam, amiben az egyik fejállományban a következő kód generálódott az egyik osztálydeklaráció során:

class pj_xmp_01Widget : public pj_xmp_01WidgetBase
{
Q_OBJECT

public:
pj_xmp_01Widget(QWidget* parent = 0, const char* name = 0, WFlags fl = 0 );
~pj_xmp_01Widget();
/*$PUBLIC_FUNCTIONS$*/

public slots:
/*$PUBLIC_SLOTS$*/
virtual void button_clicked();

protected:
/*$PROTECTED_FUNCTIONS$*/

protected slots:
/*$PROTECTED_SLOTS$*/

};

Ebben két újdonság is van számomra. Az egyik a "Q_OBJECT" szó, ami valószínűleg azt fejezheti ki szerintem, hogy az osztály a Q_OBJECT ősosztály leszármazottja. Nem tudom mi ez! Valami plusz magyarázkodás? Hiszen az első sorban már megadtuk, hogy melyik osztály leszármazottja a mi saját osztályunk, aminek az őse feltehetőleg valamilyen Q_OBJECT lehet.
A másik újdonság a "slots" kulcsszó. Erről végképp nincs semmi elképzelésem, hogy mi lehet. A rendelkezésemre álló c++ könyvek ezzel nem foglalkoznak.
Annyi bizonyos, hogy a program lefordítható és fut is, tehát a GCC érti, hogy mi van benne. Így megállapíthatjuk, hogy szabványosak ezek a kifejezések, csak számomra újak.

Meg tudnátok mondani, hol lehet ezeknek a szintaktikai újdonságoknak utánaolvasni?
Kösz előre is!

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

Szerintem itt: http://www.kde.gr.jp/~ichi/qt/moc.html

Ha jól értelmeztem, ezt nem a g++ fordítja, hanem a moc állít elő belőle C++ fájlt, amit a g++ megesz.

KisKresz

Abban az esetben szukseges az osztaly-deklaracioban a Q_OBJECT hasznalata, ha hasznalni akarsz SIGNAL - SLOT osszekoteseket. Persze ha QT-t programozol, akkor ezt akarod hasznalni, hisz enelkul nem tudsz QT "esemenyeket" osszekotni.

Amugy ez a MOC-hoz kell (Meta Object Compiler) amely pont azokat az osztalyokat keresi, amelyekben szerepel a Q_OBJECT "makro" es ezekbol uj forras-file-okat general amelyek mar tartalmazzak a szukseges meta kodot.

De bovebben: Qt-Assitant-ban olvashatsz rola.

A többiek is írták már, sokat nem akarok hozzá okosítani:
A Q_OBJECT valójában egy makró, ami a fordítónak jelzi, hogy az objektum Q* osztályhoz tartozik, de ez nem az öröklés szempontjából fontos, hanem a kiegészítő jellemzők miatt, mint a singal/slot függvények.

C++ tudás szerintem kevés a Qt átlátásához. Ajánlom ezt a könyvet ha bírsz angolul:
http://trolltech.com/developer/documentation/books/2
Akár *meg is lehet szerezni* :)

Szia dii!

Van ötleted, hogyan lehet a könyvhöz hozzájutni?

amazon.com

írj ide egy mailcímet :)

barii@axelero.hu
:)
bár én meg is vettem
köszi

tevedes, nem a forditonak jelzi, hanem a qt preprocessornak, ami megcsinalja a meta-object compilationt, IMHO

igaz... sorry a félrefogalmazásért

a slotok arra kellenek, hogy az esemenyeket le tudd kezelni. qtben ilyen hulyen oldottak meg, C#ban sokkal jobb :)

foleg hogy c++ban nincsenek anonymous delegatek :)

Szerintem meg izles kerdese a dolog. En eloszor Qt-vel csinaltam GUI-t es a SIGNAL - SLOT-ot szoktam meg, utana kezdtem el Java-val foglalkozni es Swing-gel es nehezen ment az ott hasznalt esemeny kezeles megertese.

Egyik igy oldja, a masik meg ugy.

Amugy, ha Linux, *BSD vagy valamilyen UNIX rendszer alatt akar jo GUI-s cuccokat csinalni, akkor szerintem a C++ + Qt vagy a Java (Swing vagy SWT) a jobb valasztas. A Mono korentsem tudd annyit mint ezek, es a wxWidget is messze elmarad a Qt-tol.

nemis monoban fejlesztek, hanem visual studio :-)

amugy valszin crossplatformos cuccot enis qtben tolnek.

Hat Win alatt nem sok ertelme van a Qt-nek, hacsak nincs az embernek plusz 2000-3000 $-ja ami egy licensz ara. Az OpenSource-os Win-es valtozatban pedig nincs benne minden, ellentetben a Linux, *BSD, Mac OSX valtozatokkal.

Akarom mondani, GPL valtozat. elnezest

Erre valami konkrétum? Mostanában fordítok linux alatt fejlesztett dolgokat statikus win-re és még minden megvolt ami linuxos Qt-ben megvolt. Szerintem ez valami régi infó, mert régen tényleg különbözött, illetve nem is volt GPL win verzió.

Az SQL-pluggin peldaul nem volt benne a Qt-3.X-esekbe, ha jol tudom, de lehet azota valtozott. Habar lehet csak a Qt-2.X-esbol volt GPL-es Win-es valtozat.

Hát az SQL plugin a linux változatokban sincs benne, mivel 3rd party, csak az SQLite az alap telepítésbe. Linuxon is meg windowson az adott SQL motor felrakása és a Qt fordítása vagy plugin buildelése kell.

Mondjuk a licensz eseteben a lenyeg amugy az, hogy ha Qt-vel akarsz kereskedelmi szoftvert gyartani, akkor mindenkeppen meg kell venned a kereskedelmi licenszt azokra a platformokra, amelyekre ertekesiteni akarod az alkalmazasod. Ezert kettos licenszelesu. Tehat mindaddig, amig OpenSource es ingyenese cuccokat csinalsz (nincs kommercionalis vonzata a szoftvernek) addig szorakozhatsz vele barmelyik platformon, onnantol kezdve, hogy penz is szobakerul, meg kell venned a licenszt!

Ez sem pontos információ. GPLv2 vagy GPLv3 alá kell tenned a programot amit a GPL Qt-val készítesz. És ahogy azt már jónéhányan kifejtették errefelé, a GPL nem jelenti azt, hogy nem kérhetsz érte pénzt, hanem ugyebár, hogy a forrást is odaadod (és hagyod, hogy más modosítsa, stb). Ha zárt forrást akarsz, akkor perkálsz.

Akkor szerintem nezd meg a Trolltech oldalat. Kifejezetten le van irva, hogy nem lehet kommercionalis vonzata a GPL-es valtozattal keszult proginak. Ezert kettoslicenszelesu a Qt. Qt-3.x idejen ez igy volt es szerintem ez nem valtozott azota.

Qt Open Source Edition Licensing

The Qt Open Source Edition is available to the Open Source community under Trolltech's Dual Licensing Model. The Open Source Edition of Qt and Qt Jambi is freely available for the development of Open Source software governed by the GNU General Public License (GPL). If you want to do proprietary, commercial development you need to purchase a Qt Commercial Edition.

Szerintem rosszul értelmezed. GPL alatt kell hogy legyen a program. A GPL licenc magába foglalja, hogy pénzt kérhetsz érte.
http://www.gnu.org/licenses/gpl-faq.html#DoesTheGPLAllowMoney
http://www.gnu.org/philosophy/selling.html

Szerk:
Trolltech, along with companies like My SQL and Sleepycat, uses a business model for its desktop developer tools unit called Dual Licensing.
Ugye a MySQL open source edition-t is használhatod pénz keresésre?

Igazad van, most jobban utana neztem a "Dual Licensing - The Trolltech Business Model" oldalon. De szerintem ez a Qt-3.X idejen meg nem volt igy, sot mostmar emlekszem, hogy Qt-3.X-bol nincs GPL-es Win-es valtozat. Tobbek kozott ezert kellett annakidejen Win-es licenszet megvennunk, hogy a progimat Win-en is le tudjuk forditani.

No akkor a Qt-4.X GPL-es fejlesztesek elott szabad az ut :)

Ez pontosan így van, szerencsére a 4-es megjelenésekor úgy döntöttek, hogy a win változat is GPL alá kerül, ami igencsak helyes húzás volt tőlük. Sőt most már winCE-re is tudsz fejlesztni GPL.

Apropo GPL-es Qt 4.X-es Win-es valtozat: Milyen forditot lehet hozza hasznalni??? Visual Studio 2k5 C++ lehet-e? Vagy Cygwin-ben levo g++ lehet-e? Vagy melyiket a legjobb hasznalni?

Visual Studiót lehet:
http://wiki.qtcentre.org/index.php?title=Qt4_with_Visual_Studio

Cygwin-es írásra nem emlékszem. Én mingw-ét használom ami nekem megfelel, mert csak a végeredményt szoktam ott gyorsan leforgatni, fejlesztés linuxon halad. QDevelop elvileg használható egyszerű felületként mingw-hez is, de nekem fagyott rendesen, szóval maradtam a parancssornál :)

Ugyan nem a Qt4! A Qt3-hoz van ingyenes letöltési lehetőség a következő web oldalon:

http://www.informit.com/store/product.aspx?isbn=0131240722

Sajnos nem tudom, hogy kell linknek beírni!
De ez nem nagy gond azt hiszem.

A C#-t abszolút nem ismerem. Úgy látszik foglalkozni kell majd vele.

Köszönöm mindenki segítségét! Ha világosabban átlátom a dolgot, majd összefoglalom ezen a helyen.

Qt3 és 4 között jelentős a különbség. Amúgy amit linkeltem az ugyanennek a könyvnek a update változata. Várom a mail címet :)

Hi dii!

A felhasználói adatok "kapcsolat" fülében tudsz személyes e-mailt küldeni nekem. Aminek a segítségével már nem publikusan felvehetjük a kapcsolatot.

ok, akkor küldök valamit :)

qt3 -at felejtsd el, qt4 eleg mas

Helló Mindenki!

Ígértem, hogy visszatérek erre témára, ha érthetőbben el tudom magyarázni, mit is jelent a 'Q_OBJECT' kifejezés egy Qt eszközrendszert használó C++ programban.
Tekintsük a következő, viszonylag még egyszerű, keresési funkciót ellátó dialógus doboz osztály deklarációját:

class QpjFindDialog : public QDialog // standard Qt objektumból származtatunk
{
Q_OBJECT // egy Qt makró - aktiválja a MOC-ot

public:
QpjFindDialog( QWidget* parent = 0 );
signals: // A MOC teszi érthetővé a C++ fordító számára.
void findNext(const QString& str, Qt::CaseSensitivity cs);
void findPrevious(const QString& str, Qt::CaseSensitivity cs);
private slots: // A MOC teszi érthetővé a C++ fordító számára.
void findClicked();
void enableFindButton(const QString& text);
private:
// A dialógus belső tagjainak listája:
QLabel* label; // címke
QLineEdit* lineEdit; // beviteli sor
QCheckBox* caseCheckBox; // betűméret érzékenységi opció
QCheckBox* backwardCheckBox; // visszafelé keresés opció
QPushButton* findButton; // Find gomb
QPushButton* closeButton; // Close gomb
};

Magában a kódban is vannak utalások a működésre. Amint látjuk a Q_OBJECT makróra szükség van, ha az osztálydeklaráció során signals vagy slots függvényeket is deklarálunk. A Qt rendszerén belül az eseményeket ezzel az úgynevezett signal-slot módszerrel oldják meg. Ennek a lényege, hogy két objektumot egy speciális connect() függvénnyel kapcsolatba hozunk, ahol az egyik objektum kibocsát egy esemény függvényt (signal), a mások pedig feldolgozza ezt a saját slot függvényével. Tehát maga a connect() függvény egy csatorna a két objektum között, azzal a kiegészítéssel, hogy a jel kibocsátó és a feldolgozó metódusokat is deklaráljuk.
A Qt-nél a fordítási folyamat a qmake parancs indításával kezdődik, ami létrehoz egy makefile-t, és ebben van részletesen leírva a fordítás menete. A qmake érzékeli, hogy az osztálydeklaráció során használtuk a Q_OBJECT makrót, így a makefile-ba befűzi azt az utasítást is, hogy induljon el a MOC (Meta Object Compiler). A make parancs kiadásakor a mi példánkban egy ilyen utasítás is lefut, ami egy "moc_" előtaggal rendelkező cpp fájlt is előállít:

/usr/bin/moc-qt4 -DQT_SHARED -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. -I. -I. qpjfinddialog.h -o moc_qpjfinddialog.cpp

Ez a "moc_qpjfinddialog.cpp" fogja segíteni a g++ fordítót, hogy a szabványos nyelvnek megfelelően tudja értelmezni a mi deklarációnkat. Mindezt azért is csinálták így, hogy a signal függvényeket ne kelljen a programozónak implementálni, mivel ezek szabványosítható tevékenységet látnak el. Ő a postás. Csak viszi az információt, nem kell semmi mást csinálnia. Tehát a MOC leveszi a terhet a programozóról, előállítja a signal függvények implementációját is! Rabszolgamunkától kímél meg bennünket.

Ha van valami fontos, amit kihagytam, írjátok meg!