Qt kérdések

 ( develru | 2007. június 17., vasárnap - 12:02 )

Most jött el az ideje, hogy belemélyedjek a Qt részleteibe. Valami jó fajta doksi kellene, találtam én is többet de hátha van jobb is :)

- A legfontosabb dolog, hogyan szoktátok megoldani a telepítést? Mármint az elkészített progiét. Nekem olyan megoldás kellene, amit egy mezei user meg tud csinálni. Nézegettem a BitRock nevezetű progit, de az csak felmásolja egy megadott helyre. Ez a Windowsos verziónál jó is, de Linuxnál helyben kellene fordítani (gondolom).

- Milyen licensszel lehet használni a Qt-t, a honlapon van Open Source verzió, meg fizetős. Nem igazán értem, ezt az egészet :)

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ő.

Telepítést én úgy oldom meg, hogy windowsra NSIS, linux/bsd/etc. pedig tar.gz - forrásban :) Aki használni akarja, az le tudja fordítani, aki nem tudja, annak meg készítettem doksit hozzá :) Nem elegáns megoldás, de ez van. Amúgy a diplomamunkám Qt/C++-ban fogom készíteni, az előzetes tématervembe pedig Autopackage formátumú telepítőt írtam platform != Windows-hoz... meglátjuk.

Licenszelés:
- Ha fizetős progit fejlesztesz/nem akarod kiadni a forráskódot, akkor vásárolnod kell licenszet
- Ha FOSS-t fejlesztesz, akkor tökéletes a GPL-es változat.

Doksi:
doc.trolltech.com / Qt Assistant - legjobbak

Jasmin Blanchette / Mark Summerfield - C++ Gui Programming with Qt 3 és Qt 4 - hivatalos Qt könyvek

Qt Quarterly - hasznos dolgok Trolltechéktől

The Book of Qt 4 - The Art of Building Qt Applications
by Daniel Molkentin (van németül is és angolul is) - most fizettem be az előleget rá swsbooks.hu-n, elvileg júliusban jelenik meg és egész korrekt könyvnek ígérkezik

Qt Programming in 24 hours
by Daniel Solin - 24 órás sorozat... hát nem tudom :)

Van még egy "Modern OO Design Patterns in C++ and Qt4" nevű könyv, de az szerintem már advanced level, szóval azzal még várok :)

qtforum.org - hasznos fórum

lists.trolltech.com - levlista, sok segítőkész emberrel :)

--
A gyors gondolat többet ér, mint a gyors mozdulat.

subscribe

A licenszelés tavaly megváltozott a 4.5-ős verziótól. Most már inkább ez a helytálló:
http://hup.hu/node/82989#comment-955324

"Amúgy a diplomamunkám Qt/C++-ban fogom készíteni,"
Mi történt azóta?
--
unix -- több, mint kód. filozófia.
Life is feudal

Most valami fejlesztő környezetet keresek. Van valmi olyan ami ha a Designer-ben létrehozom a slot-okat, akkor az megjelenik a headerben is?

--
A lehetetlen csak a lusta ember kifogása!

Eclipse+CDT+QtEclipse plugin-t használom én... a plugin még eléggé technical preview, vannak gondjai, de egész összeszedettnek tűnik. Ott van még kdevelop, bár régen láttam, nem tudom hogy állnak vele és van egy QDevelop nevű, kifejezetten qt4-hez készült IDE, még nem próbáltam, levlistára járóknak tetszett...

--
A gyors gondolat többet ér, mint a gyors mozdulat.

Én KDevelop-ot használom, a KDE-s alkalmazásokhoz kiváló! A Qt3-hoz is nagyon jól használható, a Qt4 nél vannak bajaim vele, de az is lehet, hogy ott a kevés tudásom a gond, és valamit rosszul csinálok.

--
A lehetetlen csak a lusta ember kifogása!

Eclipse + CDT + QtClipse

Semmi designer integráció, de a pro fileokat "szinezi", qmake meghívása 2 kattintás.
Ha valaki nem "Managed C/C++ project"-hez szokott, annak ideális.

"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee."
-- Ted Ts'o

Ne kenyelmesedj tulsagosan el. Amugy en is kdevelop-ot hasznalok, es az adott designeres ablaktol oroklok (Qt4), a signalokhoz kezzel konnektalom a kezi slotokat. uic nagy barat.

--

()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.

http://doc.trolltech.com/4.4/designer-using-a-component.html

Ha jól értem te "Multiple Inheritance Approach"-ot használsz?
Vagy a KDevelop a Qt3-szerű megközelítést alkalmazza?

Szerintem a "Single Inheritance Approach" a legjobb, a fejlesztők is ezt ajánlják (legalábbis az eclipse plugin és a Qt Creator is ezt használja)...

És a kézzel irogatott connect-eknél kényelmesebb az auto-connect...

"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee."
-- Ted Ts'o

Multiple-t csinalok single-ben. Vagyis en kozvetlen, es public modon oroklok a generalt widgettol (az ok nagyon egyszeru: ki lehet hasznalni azt a tenyt, hogy a generalt kod eleve QWidget).

Olyan ertelemben csinalom kezzel, hogy a nem-standard slotokhoz kezzel konnektalok. Persze, amit lehet designerbol, azt megcsinalom, de amit nem, azt kezzel herkesztem. Mivel public oroklodesem van a designer-generalt kodtol, igy konnyen tudok konnektalni, nem kell szivatnom magamat sem a wrapper osztalyon belul, sem azon kivul.
--

()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.

"az ok nagyon egyszeru: ki lehet hasznalni azt a tenyt, hogy a generalt kod eleve QWidget"

Akkor ez KDevelop feature lesz, mert eredetileg az uic nem ilyen kódot generál...
Qt3-nál is ezt csinálta a KDevelop (nem tudom, hogy akkor ez volt-e a "hivatalos" módszer vagy sem), gondolom ezért csinálja most is ezt...

"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee."
-- Ted Ts'o

Valoban... hmm... nem tudom, nekem megette eddig QWidget-nek. De alapvetoen mindegy is, mert lehet a QWidgettol is meg ettol is akar publikusan is orokolni, hiszen nem nagyon van fedes.

Amugy mostansag a KDevelop-nak nem sok koze van a generalt kodhoz. CMake es KDE4-es CMake helperek generaljak a kodot. Ami a lenyeg, hogy a KDevelop iranyitasa alol egyre tobb dolgot kivesznek, ugyanis a CMake-ben mindent milliofelekepp meg lehet valositani. Az autoconf meg egy megturt szemely lesz, aki tehat arrafele van, az mar most gondolkodjon a valtason.
--

()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.

http://trolltech.com/products/qt/licenses/licensing/opensource

- ha GPL-es programot csinálsz, használd az OpenSource verziót - de ez kevesebbet tud
- ha a GPL nem jó a programodnak/cégednek, vedd meg a Commercial-t.

szerk: bocs, most látom hogy már leírták.

Az OpenSource Qt miben tud kevesebbet, mint a Commercial?

Ha jól tudom, nincs hozzá Qt Solutions (3.x-ben ActiveQt is kimaradt, hogy 4.x-ben van-e, abban nem vagyok biztos) és windows alatt a visual studio integráció, de elvileg ez megkerülhető 1-2 patch-csel :), illetve nincs hozzá hivatalos support.

--
A gyors gondolat többet ér, mint a gyors mozdulat.

A QtSoap is kimaradt sajnos.

Akkor ott a gSOAP :):)

Igeeeeeen! :)))

Szerintem, ha commercial progit szeretnél írni, várd meg a kiadásával a qt 4.5-öt, ami már LGPL-es lesz, így megspórolhatod a licensz díjat!

Ha valaki használja a KDevelop-ot Qt4-ben való feljesztésre, az segíthetne.

Létrehozom a GUI-t Qt Designerrel és innentől kezdve megvagyok lőve. Van egy árva ui fájlom meg ugye a project main fájlja, de valahogy a ui fájlból kéne generálni forrásfájlokat. 'Create or Select implementation' menüvel ugyan létrehozza a fájlokat de csak egy üres osztályt hoz létre semmi több.

--
A lehetetlen csak a lusta ember kifogása!

http://women.kde.org/articles/tutorials/kdevelop3/index.html

Én ezt ajánlom. Igaz Qt 3 és KDevelop 3.x, de kb. így megy a Qt4-es származtatás/projektkészítés is.

--
A gyors gondolat többet ér, mint a gyors mozdulat.

uic -h

A kovi van:
1) Letrehozod az ablakot designerrel
2) CMakeLists.txt (az egyszeruseg kedveert kihagyom a szep forrasfa kesziteset, meg hasonlo okorsegeket. Csak kod:

PROJECT(foobar)
FIND_PACKAGE(Qt4 REQUIRED)
INCLUDE_DIRECTORIES(${QT_INCLUDES})
QT4_WRAP_UI(ui_mainwin.cpp mainwin.ui)
QT4_WRAP_CPP(mainwin.moc mainwin.cpp)
SET(foobar_SRCS ui_mainwin.cpp mainwin.cpp)
ADD_EXECUTABLE(foobar ${foobar_SRCS})
TARGET_LINK_LIBRARIES(foobar ${QT_LIBRARIES})

3) A mainwin.cpp vegere #include "mainwin.moc"

Es ennyi.
--

()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.

Kezdem teljesen elveszíteni a türelmemet! Nem vagyok programozásban kezdő, de ez nagyon ki fog rajtam.

Létrehoztam egy alap Qt4 projectet a KDeveloppal. Hozzáadtam egy formot MainWindow-t választva. Generáltam Subclasst ugyanúgy ahogy a doksi írta. Eddig rendben is van. Átírtam a main fájlt majd fordítottam. Ezt a hibaüzenetet kapom:

 
main.cpp:22:24: error: QApplication: Nincs ilyen fájl vagy könyvtár

A main.cpp:

 
#include <QApplication>
#include "foform.h"

int main(int argc, char *argv[])
{
    FoForm *fo = 0;
    
    QApplication app(argc, argv);
    
    fo = new FoForm();
    fo->show();
    return app.exec();
}

Ha nem az alap projectet, hanem az összetettet választom akkor pedig ez a main fájl:

 
#include <QApplication>
#include "elsoqt4.h"

int main(int argc, char *argv[])
{
      Q_INIT_RESOURCE(application);
      QApplication app(argc, argv);
      elsoQt4 * mw = new elsoQt4();
      mw->show();
      return app.exec();
}

Az utobbi fordul és fut is.

A kettő között annyi a különbség, hogy a generált cucc az a form adatait xml-ből szedi, nincs ui fájl.
--
A lehetetlen csak a lusta ember kifogása!

Lehet hogy gagyiságot mondok, de egy fél napot én is szívtam a QT4+KDevelop beállítással. Nézd át alapostan a projekt beállításokat, hogy a 4-es QT-ra van-e állítva minden (C++ menüpont azthiszem).

Lehet hogy qt3 lib-et próbálja használni. Ha a QApplication-t kicseréled qapplication.h-ra és megy (vagy legalábbis megtalálja a qapplication-t), akkor ez a gond.

De lehet hogy más a gond.. én a designer részt nem szoktam haszálni.

A subproject option-ban a Qt4 librariknál be kellett pipálnom a Gui-t, így már működik.

--
A lehetetlen csak a lusta ember kifogása!

Legkozelebb eleve GUI projekttel indits, akkor nincs ilyen gond.
--

()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.

#include <QtGui/QApplication> és jó lesz, nincs pipálgatás és Ok, Mégse, Tallózás, Igen, Nem, bla-bla...;)

Ha KDevelop-ban beírom ezt a sort:
label->setText("Szöveg");
akkor az ö betü helyett ronda karakterek jelennek meg. Ha jól tudom a KDevelop kódolása utf8. Vajon mit kellene átállítanom, hogy ilyen hibák ne legyenek?

--
A lehetetlen csak a lusta ember kifogása!

label->setText(trUtf8("Szöveg"));

Kényelmesebb globálisan beállítani (a QApplication után):

QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));

"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee."
-- Ted Ts'o

Hali!

Én is buzgálkodtam Qt-val, már le is adtam diploma formájában :). Ha kell szólj, elküldöm, hátha segít vmit.

üdv. borisz

Annak örülnék!

rityilevlist@yahoo.de

--
A lehetetlen csak a lusta ember kifogása!

Hali

En is belekostoltam ebbe a QT-ba, meghozza a 4-es verziot hasznalom/hasznalnam.
Szeretnek egy gombnyomasra valamilyen esemenyt. Oke hogy designerbe osszehuzogatom a widgeteket es megadom hogy milyen esemeny tortenjen, de en egy sajat kezuleg irt es elnevezet eljarast szeretnek megadni a gombnak. Egy OT3 -as designer tutorialban lattam (http://www.digitalfanatics.org/projects/qt_tutorial/chapter05.html), hogy sajat kezuleg lehet ilyeneket beirkalni. A 4-es verzioban viszont ilyet nem talalok. A signal/Slot editorban csak is legordulo menukbol valaszthatok es magam semmit nem irhatok be.
Tud erre valaki egy designer beli megoldast, vagy szepen vegyek fel mindent en a header fajlokba?
Ha csak az utobbi megoldas lehetseges, akkor az eleg gaz, mert azt jelenti hogy visszafejlodott a szerkeszto :S

A 4-es verziótól kezdve ez a lehetőség megszűnt. Kinek jó, kinek nem, kézzel kell felvenni a saját slotokat. Anno volt pár thread ezzel kapcsolatosan a levlistákon, de a fejlesztőknek, ha jól rémlik sikerült kielégítő magyarázatot adni eme csonkítás okára :)

--
A gyors gondolat többet ér, mint a gyors mozdulat.

A Qt Designer 4 már csak egy GUI szerkesztő, IDE-be integrálva érdemes használni. Qt Designer 3 a KDevelop 3-ban működött de Qt Designer 4-gyel állítólag problémák vannak benne, a KDevelop 4 pedig még gyerekcióben jár. Újabban a Qt Deasigner integrálódik az Eclipse-be, még nem próbáltam, de feltételezem, hogy lehet benne közvetlenül létrehozni új slotot.

Nekem nincs majdnem semmi problémám vele.
Egy bugot ismerek: .ui file megnyitáskor kétszer nyílik meg a Designer.

Es ott van meg a Qt-Creator ami direkt a 4-es hez keszulget es van debugger is benne.

Kdev4: A legujabb svn trunk mar egesz hasznalhato. Ugyan a designer integraciot nem probaltam, de minden egyeb mas egesz flott mar. Sajnos meg sokszor crashel, de ez meg egy erosen wip cucc. El lehet viselni.
KDev3: Qt4 eseteben csak a kezi modszer jo, minden mas felejtos. Amit kellene csinalni, hogy a KDE4 makroit kiemelni, ugyanis hihetetlenul megkonnyitik a munkat.
--

()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.

QT 3 óta itt történt némi változás, a designerben kb semmi kódot nem lehet írni. (Hála istennek...)

Ezt olvasgasd:
http://doc.trolltech.com/4.3/designer-using-a-component.html

Első kérdés, hogy hogyan használod fel a programodban a designerben megtervezett felületet.
Ha eclipse-et használsz QT eclipse integratorral, akkor az alapból a Single Inheritance módszerét használja. (Gondolom a Visual Studio-s is...)
Ha QDevelopot, akkor az a Multiple Inheritance módszert.

Ha egyiket sem, akkor döntsd el mit használsz. :)
(A direkt módszer nem túl objektum-orientált, én hanyagolnám...)

Ha csak saját slotot akarsz, akkor az auto-connect a te barátod.
(Widgets and Dialogs with Auto-Connect)
Semmi dolgod nincs, csak megfelelően elnevezni a slotot.

Ha saját nevet is akarsz a slotnak, akkor egyszerűen csak létre kell hoznod, majd kell egy connect, és kész.

"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee."
-- Ted Ts'o

Nos, egesz jol haladok, de most egy kis problemaba utkoztem.
Ha egy widget erteket, jelen esetben egy textline-et valtozoba akarom tenni, akkor a valtozo tiusa QString. Csak en a kapott ertekhez hozza szeretnek adni egy szamot, amihez integerre kellene alakitani. Na ezen a ponton vagyok megakadva. Probaltam mar mindenfele fuggvennyel, de mindig hiba van toluk.
Aztan a kapott szamot ujra QStringge kellene alakitani, hogy ugyanabba a widgetbe vissza tudjam iratni.

Kis kod segitsegkeppen:

n = calc_display->text();

[... itt kellene atalakitani es hozzaadni mondjuk 10-et ...]

calc_display->setText(n);

Probaltam setNum-al es QString::number-al, de nem jott ossze :(
Valakinek van tippje a problemara?

Érdemes az assistantban ilyenkor a QString osztályt böngészgetni:

/* long QString::toLong ( bool * ok = 0, int base = 10 ) const
Returns the string converted to a long using base base, which is 10 by default and must be between 2 and 36, or 0. Returns 0 if the conversion fails.*/

n = calc_display->text();

long i = n.toLong();

/*QString & QString::setNum ( int n, int base = 10 )
Sets the string to the printed value of n in the specified base, and returns a reference to the string.*/

QString s;
s.setNum(i);
calc_display->setText(s);

--
The Net is indeed vast and infinite...
http://gablog.eu

Vagy szupertömörítve:

calc_display->setText(QString::number(calc_display->text().toInt() + 1));

http://doc.trolltech.com/4.4/qstring.html#toInt
--

()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.

Nem tudja véletlenül valaki, hogy hogyan lehet egy szövegfájlba szöveget beszúrni?

QTextStream-el próbálkoztam, de nem sikerült rávennem a beszúrós üzemmódra.

Vagy csak az marad, hogy kiolvasom az egész fájlt, majd visszaírom?

A dolog egy headerbe változók és metódusok beszúrására kellene. A qtcreator tud olyat amit én szeretnék (amikor a widgetek slotjait implementáltatom beszúrja a headerbe a megfelelő helyre). Nézegettem a kódját a gitoriuson, de túl komplex volt ahhoz hogy megtaláljam a nekem kellő részt. Esetleg ha valaki tud valami hasonló kicsi nem túl komplex qt-s classt erre a célra, kérem jelezze.

Előre is köszönöm.

Beszúrós üzemmódról nem tudok, akár QDataStream, akár QFile közvetlen használatát választod, maximum átírni tudsz a seek() és write() segítségével. Gondolom azért mert a beszúrás elég költséges dolog, gyakorlatilag az újraírást jelenti akár te csinálod, akár a függvény. De lehet hogy rosszul tudom, mindenesetre nincs :)

Ha szöveges fájlokról van szó (header ugye?) akkor nem nagy kaland, nyitsz egy új fájlt, a régit a QTextStream-mel olvasod, az újba írod, ahova kell beszúrsz. Aztán a régit törlöd, az újat meg átnevezed a régire. Ezt simán le programozható.

Ennyit tudok :) a kollégák lehet hogy többet.

Köszi a választ.
A megoldásom végül hasonló lett a tiédhez. Létrehozok két QFilet a fájlra, az egyiket QFile::readra a másikat QFile::readwritera nyitom meg. Fogok két textstreamet, a megfelelő QFilekra irányítom őket, az egyik végigolvassa, a másik pedig kiírogat iletve beszúr. És csak a végén flusholok, és nem használok közben endl-t.

Ezt így felejtsd el!
Anélkül, hogy te explicit flush-olnál, az megtörténhet. Ennélfogva a dolog csak véletlenül működik.
Illetve a dolog akkor működhet, ha garantálod, hogy az olvasás mindig előrébb tart, mint az írás, még a beszúrás pillanatában is.

Arról nem is beszélve, hogy ezzel a megoldással áramszünet, vagy egyéb programhiba esetén megölted a régi fájlt is.

"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee."
-- Ted Ts'o

Tízsoros blokkokban olvasom, majd írom ki a blokkot tíz sor után. Beszúrnom egyszerre csak max 3 sort kell (egy privát változó, és két public metódus)

De nagy fajlokkal ne csinald, nem hangzik ez jol sehogyse.
--

()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.

Ja, meg nem is működik megfelelően.
Marad az, hogy kiszedem egy stringbe, ott átalakítgatok, majd egy másik textstreammel kiírom.

Na ezt pláne ne csináld nagy fájlokkal. :)

"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee."
-- Ted Ts'o

Nem ertem, miert nem jo a tempfile-s dolog.
--

()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.

Sziasztok,

Van egy kis problémám, hátha valaki már találkozott hasonlóval.
Különféle nyomtatványokat szeretnék nyomtatni, amik lelke egy táblázat.
Úgy gondoltam, hogy bazilusta leszek, és csinálok nekik egy formot, amire designerben felszórom az egyéb dolgokat, és a tableviewemet. Ez meg is van, QPixmap::grabWidgettel ki tudom paintelni a nyomtatóra, azonban az így kapott qpixmap felbontása nagyon alacsony. Nincs valakinek valami tippje, hogy hogyan lehetne valami egyszerű módon egy widgetről nagyobb felbontású képet lekérni. Ötleteim vannak (emeljem meg minden méretét a kívánt nyomtatandó dpinek megfelelően), de hátha van valami királyibb út.

Azt hiszem ez nem fog szépen működni, úgy gondolom a grapWidget a képernyő felbontásnak megfelelő képet fog adni, tehát 72~96 dpi, ami elég alkalmatlan nyomtatásra. Ha mindent 3x méretre felnyomsz (widget és betűméret) akkor talán használható. A betűméretet alkalmazás szinten állíthatsz, a widget sem lehet gond.

De szerintem ennyi fáradozással, akár meg is írhattad volna a QTextEdit-be az adatokat belehányó programrészletet :)

QTextedit annyira nem nyerő nekem, ugyanis elég sok táblázat meg miegymás lenne a lapon.
Most jobban körülnéztem a témában, és találtam egy NCReport nevű libet, ami első blikkre messzemenően kielégíti az igényeimet. Másodikra már nem, mert nincs belőle csak bináris változat, ami csak 32 bites.

Example kódok között nézted az orderform-osat? Ez textedit, de kb. azt lehet vele megcsinálni, amit Te szeretnél.

--
A gyors gondolat többet ér, mint a gyors mozdulat.

Ha megszerzed a qpixmapot, azt mar atmeretezheted, nem?
--

()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.

Átnak átméretezhetem, de elmosott, ill. pixeles lesz a nyomtatott.
Az ncireport nálam elbukott, mivel nincs 64 bites libjük, és egy darabig nem is lesz "technikai problémák miatt".

Nézegettem az openrpt-t, de eddig nem sikerült eligazodnom, illetve eredmény elérnem vele.

QWidget::render QPrinter-re?

"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee."
-- Ted Ts'o

Mjpeg streamet szeretnék leszedni a QNetworkManager segítségével.
A requestet elküldöm, és a folyamatosan jövő adatot a visszaadott QNetworkReply readyRead() szignálja segítségével szeretném feldolgozni.

A szignál emittálódgat szépen. Első körben kiírogattam fájba a ami lejön readAllal. Az első csomagban van az elválasztó string \r\n-el lezárva. Ezt szeretném kiolvasni, de nem megy.

if (mjpgState == MjpgFirstBoundary) {
            if (mjpgReply->canReadLine()) {
                qWarning() << "can";
                mjpgBoundary = mjpgBuffer->readLine();
                mjpgState = MjpgHeader;
                qWarning() << mjpgBoundary << mjpgBoundary.length();

            }
}

A canreadline doksija azt mondja, hogy nem bufferelt eszközökön nem működik. A QNetworkReplynak van setReadBuffersize metódusa, amiről azt gondolom, hogy ez bufferelt. Próbáltam azt állítgatni, de nem vezetett eredményre.

Kínomban elővettem egy QBuffert, és abba tettem át az adatokat a következő kódrészlettel:

while(mjpgReply->bytesAvailable()) {
        char c;
        mjpgReply->getChar(&c);
        mjpgBuffer->putChar(c);
        if (mjpgState == MjpgFirstBoundary) {
            if (mjpgReply->canReadLine()) {
                qWarning() << "can";
                mjpgBoundary = mjpgReply->readLine();
                mjpgState = MjpgHeader;
                qWarning() << mjpgBoundary << mjpgBoundary.length();

            }
        }
    }
}

Mint láthatjátok a kód hibás (a buffer tartalmát kellene canreadlineolni.), viszont így működik a reply canReadline() metódusa.
Bármi ötlet, mit tolhattam el?

A konkrét kódokhoz nem tudok sokat hozzászólni, de az álmoskönyv szerint nem jó ötlet bináris stream-nél a readline-t erőltetni.

A megoldás valami bináris protokoll kitalálása.

Legegyszerűbb az, ha minden jpeg előtt elküldöd annak méretét.
Ekkor fogadó oldalon csak beolvasod a méretet (int = 4 byte, ha van ennyi, ha nincs, vársz amíg lesz), majd beolvasol annyit amekkora a méret.
Ha nem jön meg egyszerre, akkor beolvasol annyit amennyi van, a maradékra vársz. (Ezt megteheted QByteArray-be, vagy rögtön fájlba, ha az a végcél.)
Ha beolvastál méretnyi byte-ot (nem többet), újra olvashatod a övetkező csomag méretét.

(Qt Fortune server-client example pont ezt csinálja.)

"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee." -- Ted Ts'o

Az mjpeges szerver készen van, alkalmazkodnom kell.
0. pontként az mjpg-streamer streamje a cél, 1. pontként pedig egy webcamxp nevű properitary szuttyé.

Egy QTcpSocketten alapuló implementációm van ami működik, csak egy átláthatalan trágyadombbá vált, ezért úgy gondoltam, hogy átírom QHttp-sre, amit 4.6 óta a QNetwork* stuffal rendeznek.

Szóval a dolog így működik:
A getre a szerver visszaböffenti a választ, amit követ a Jpegeket elválasztó --boundarydonotcross\r\n string.
A választ a QNetworkReply benyeli, az első readyreadben az elválasztó string van. Ezt akartam kiszedni readlineval.
Ez követi egy
Content-Type: image/jpeg
Content-Length: amit követ a mérete két \r\n-el lezárva. Eztán jön a méret bájtnyi jpeg, ami után az \r\nelválasztóstring\r\n jön.

Azért szeretném canreadlinelni valamilyen módon, mert az sokkal szofisztikáltabb kódot eredményezne.

Az igazi talány számomra az, hogy a QNetworkReply buffered eszköznek minősül-e?
Note that unbuffered devices, which have no way of determining what can be read, always return false.
A QTcpSocket az az tudom, de erről nem ír a dokumentáció.

A QNetworkReplay tuti bufferelt...

Nézegettem kicsit a Qt forrását, szerintem ez bug.
A canReadLine nincs felüldefiniálva a QNetworkReply-ban, az QIODevice::canReadLine pedig a buffer változó canReadLine-ját hívja.
Ami azért gond, mert a QNetworkReplay nem használja ezt, hanem a saját readBuffer-jét.
Legalábbis így első blikkre.

A második kódrészleted nem tudom miért változtatna ezen, úgyhogy vagy én néztem be valamit, vagy te. :) (debug a te barátod)

Ha véletlen nekem lenne igazam, akkor egyrészt küldj bugreport-ot, másrészt a saját buffer lesz a megoldás (amíg nem javítják). Csak könyörgöm ne getchar-putchar-ral meg ciklussal. :)

"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee." -- Ted Ts'o

A puchar getchart én sem gondoltam komolyan, csak egy korábbi debug kísérletből maradt meg.
A dolog valóban működik, ha tolok egy getchart a replyra. Ha a getchart kiveszem, akkor nem működik.
Most ez van a readyreadben:

    qWarning() << mjpgReply->bytesAvailable();
    char c;
    mjpgReply->getChar(&c);
    if (mjpgReply->canReadLine()) {
        qWarning() << "can";
        mjpgBoundary = mjpgReply->readLine();
        mjpgState = MjpgHeader;
        qWarning() << mjpgBoundary << mjpgBoundary.length();
    }

Küldök bugreportot, és majd ha mástnem Nokiáék lecsesznek.

Érdekes lenne kidebuggolni, hogy mi történik. Qt-s srácoknak is könnyebb dolguk lenne...

Az mjpgBoundary-ból nem hiányzik az első karakter?

"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee." -- Ted Ts'o

Ha getcharozok, akkor természetesen az az egy bájt kiesik az elejéről.
Én szívesen debugolok, csak fogalmam sincs hogyan kezdjek hozzá.
Gondolom fel kell tennem a libqt4-dbg csomagot.
Ha ez megvan, akkor debug módban forgatva a debugger be fog ugrani a Qt-s függvények belsejébe is?
Már cselekszem, csak így a vízszintesen eső hóban wifin keresztül karcsúan jön a net.

Szerk: No lejött. Felraktam. Qtcreatorban a qt versionsnál hozzáadtam a /usr/lib/debug/usr/bin/qmake-qt4 qmaket, de erre közli, hogy nem tudja a Qt binárisokat megtalálni. Betettem a PATH-ba a /usr/lib/debug/usr/bin -t, de ez nem segített. Bármi ötlet?

Passz, Linux alatt még nem használtam a QtCreator-t...

De ha sikerül beállítani, akkor simán be tudsz lépni a Qt hívásokba.

"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee." -- Ted Ts'o

Azert nem latja, mert idiota fajlelnevezeseid vannak. Ez persze valami debian specifikus szivatas megint.
qmake, linguist, etc. Semmi 4-es semmi qt4 postfix, csak siman.

Bar, ha ram hallgatsz, akkor leszedsz egy qt forrast, es -developer-build kapcsoloval forditod le. Ekkor nem fog installalast igenyelni (portable qt.)
--

()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.

Kisymlinkeltem az összes suffixelt fájlt simára, de így sem megy.

Az amúgy normális, hogy a /usr/lib/debug/usr/bin mappában lévő qmake-qt4 és tsai fájl nem futtathatóak?
Illetve ha jogot adok rá, akkor

mm@lapos:/usr/lib/debug/usr/bin$ ./qmake-qt4 
bash: ./qmake-qt4: nem futtatható bináris fájl

file, ldd outputot kerek. Es nem, nem normalis.

Bar, lehet meg mindig az lenne a legjobb, ha forgatnal magadnak egy qt-t, es ezt a debianos szerencsetlenseget elfelejtened a fenebe.
--

()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.

mm@lapos:/usr/lib/debug/usr/bin$ file qmake-qt4 
qmake-qt4: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked (uses shared libs), for GNU/Linux 2.6.15, not stripped
mm@lapos:/usr/lib/debug/usr/bin$ ldd ./qmake-qt4 
Szegmentálási hiba

Ok engedek nektek, forgatok egyet.

Ha ezt a 64 bites cuccot egy 32-es gepen akartad futtatni, akkor mar meg is van a liba oka.
--

()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.

Negatív, 64 bites a rendszerem, a Qt-m, meg általában mindenem.

Este ota ragodok azon, nem lehet-e ennek az az oka, hogy a getchar triggerel valami eloreolvasos dolgot, amitol a canReadLine mar tud jot visszaadni.
--

()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.

Én a qt forrásban nem láttam erre lehetőséget, de simán lehet, hogy benéztem valamit, annyira nem ástam bele magam...

"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee." -- Ted Ts'o