Avaleht
uus teema   vasta Tarkvara »  Programmeerimine »  Qt's mõned probleemid ja küsimused märgi kõik teemad loetuks
märgi mitteloetuks
vaata eelmist teemat :: vaata järgmist teemat
Hinnavaatlus :: Foorum :: Uudised :: Ärifoorumid :: HV F1 ennustusvõistlus :: Pangalink :: Telekavad :: HV toote otsing
autor
sõnum Saada viide sõbrale. Teata moderaatorile
otsing:  
Fiocchi
HV kasutaja
Fiocchi

liitunud: 04.01.2005




sõnum 27.01.2008 23:58:51 Qt's mõned probleemid ja küsimused vasta tsitaadiga

Lugedes mitmete HV kasutajate soovitusi ja kiidusõnu, hakkasin Qt'd näppima. Olen mõnda aega juba sellega tegelenud, aga nüüd ühte programmi tehes olen kohanud probleeme ja on tekkinud ka mitmeid küsimusi. OS'iks on windows.

Alustuseks ilmselt kõige tähtsam. Selles programmis on 8 rida QLineEdit kastidega(igas reas 11 kasti arvude jaoks), kuhu sisestatakse andmed. Täpsemalt esimesse tuleb kolmekohaline arv, teistesse 1 komakohaga kahekohaline arv(näiteks 10,9). Kastides, kuhu veel ei ole midagi sisestatud, on 00. Need liidetakse kokku ja näidatakse tulemus teises aknas. Probleem seisneb aga selles, et kui kasutan liitmiseks sellist koodi:
   bool onnestus = false;
   float sum = 0;      //summa koos kolmekohalise arvuga
   float seeria = 0;   //summa ilma kolmekohalise arvuta
   int ssum = 0;
   sum = tabel->tulemus[i]->text().toFloat(&onnestus);
   for(int j = 0; j<10; j++){
      sum += tabel->lask[j][i]->text().toFloat(&onnestus);
      seeria += tabel->lask[j][i]->text().toFloat(&onnestus);
   }
   if(onnestus == true){
      ssum = sum * 10;
      if(ssum % 10 != 0)   //et näha kas on täisarv, kui ei siis lisada lõppu ",0"
         tabel->summa[i]->setText(est->toString(sum));
      else tabel->summa[i]->setText(est->toString(sum) + ",0");
   }else tabel->summa[i]->setText("Viga");
   if(onnestus == true){
      ssum = sum * 10;
      if(ssum % 10 != 0)   //et näha kas on täisarv, kui ei siis lisada lõppu ",0"
         tabel->seeria[i]->setText(est->toString(seeria));
      else tabel->seeria[i]->setText(est->toString(seeria) + ",0");
   }else tabel->seeria[i]->setText("Viga");
Nii kaua asi töötab, kuni arvudeks sisestatakse 580; 9,7; 10,6; 10,8 ,siis läheb midagi viltu ja vastuseks näitab 31,1,0 ja kogusummaks 611,1,0. Kui lisada järgmistesse kastidesse veel arve töötab asi jälle nii, nagu peab. Samuti ei ole ka probleeme kui arvud on teises järjestuses või teised, nii et summa on sama. Katsetades sain teada, et selline asi juhutb ainult ühel real korraga, ehk kui mõnele teisele reale samad arvud samas järjestuses sisestada, toimib selle rea arvutamine õigesti. Lisaks kaasneb selle anomaaliaga see, et kui ühele reale viskab summaks 31,1,0, siis mõnele teisele reale kirja "Viga!". Millest selline asi tuleneda võib?


Igatahes muutsin natuke koodi ja eelnevalt kirjeldatud probleem kadus, kuid ilmnes uus. Võimalik, et see probleem oli ka eelmise koodiga.
   bool onnestus = false;
   int sum = 0;      //summa koos kolmekohalise arvuga
   int seeria = 0;   //summa ilma kolmekohalise arvuta
   float ssum = 0;
   sum = (tabel->tulemus[i]->text().toFloat(&onnestus)*10);   //Kas välimised sulud on ikka vajalikud?
   for(int j = 0; j<10; j++){
      sum += (tabel->lask[j][i]->text().toFloat(&onnestus)*10);
      seeria += (tabel->lask[j][i]->text().toFloat(&onnestus)*10);
   }
   if(onnestus == true){
      ssum = sum;
      ssum /= 10;
      if(sum % 10 != 0)   //et näha kas on täisarv, kui ei siis lisada lõppu ",0"
         tabel->summa[i]->setText(est->toString(sum));
      else tabel->summa[i]->setText(est->toString(sum) + ",0");
   }else tabel->summa[i]->setText("Viga");
   if(onnestus == true){
      ssum = sum;
      ssum /= 10;
      if(ssum % 10 != 0)   //et näha kas on täisarv, kui ei siis lisada lõppu ",0"
         tabel->seeria[i]->setText(est->toString(seeria));
      else tabel->seeria[i]->setText(est->toString(seeria) + ",0");
   }else tabel->seeria[i]->setText("Viga");
Nüüd aga on tulemus alati kas 0,1 või 0,2 võrra väiksem tegelikust. Näiteks samade arvudega, millega enne jama oli on nüüd summa 31,0 ja kogusumma 611,0. Sama on summa ka kui viimane arv asendada 10,9'ga, kuigi sel juhul peaks ju kokku tulema juba 31,2 ning 611,2. Mispärast ta nüüd selline on? Arvutustehted on ju sooritatud int'idega, millega ei tohiks selliseid anomaaliaid olla nagu float'idega.


Lisaks veel mõned üldisemad küsimused Qt kohta, millele netist vastust ei leidnud:
Esiteks, kas ja kuidas on võimalik näiteks selline asi:
connect(lineEdit[0], SIGNAL(editingFinished()), this, SLOT(summ(0)));
Ehk siis kuidas kutsuda sellise signaaliga, mis ei saada arvu, slot, mis tahab argumendiks arvu?

Kas Qt's on kuidagi võimalik automaatne tähesuuruse muutmine vastavalt widget'i suurusele ilma, et ise koodiga püüaks QRezieEvent'e ja manuaalselt font'i ei muudaks? Nagu zuum vms äkki?

Kas ja kuidas on võimalik muuta/lisada saadavas .exe failis programmi kohta käivat infot nagu versioon, kirjeldus jms info, mis windowsi programmide exe'des tavaliselt olemas on?

Kas on võimalik teha Excel'i faili(.xls) Qt's? Praegu olen sunnitud kasutama taktikat, kus teen oma andmetest tabeli .txt faili, mille siis saan excel'isse importida. Võiks olla parem võimalus.


Koodi kirjutamiseks kasutan Eclipse'i, millel vajalikud pluginad peal. Sellega on aga sellised probleemid, et esiteks ei saa seal miskipärast muuta widgetite properties'e. Nimelt vajutan widgeti peale, muudan näiteks Property Editor'i aknas widget'i nime ja kui nüüd kuskile mujale vajutan taastub esialgne nimi. Ehk siis kõik muudatused kaovad. Ainult Qt Designer'iga saan muuta neid omadusi nii, et need ka püsima jääksid.

Teine jama on selline, mul on installeeritud Borland C++ Builder oma kompilaatoriga ning koos Qt'ga tuli ka vajalik MinGW. Eclipse'ile ei suuda, aga ma kuidagi selgeks teha, et kasutada tuleb MinGW'd, mitte Borlandi kompilaatorit. Nimelt Build käsu peale tuleb teade, et Borland ei saa asjadest hästi aru, kuigi tegelikult oli see käsk mõeldud ju MinGW'le. Siiani olen teinud nii, et Eclipse'ise kirjutan koodi, salvestan ja siis eraldi Qt Command Promt'i aknas annan käsu make ning Eclipse'is omakorda käivitan programmi. Kas on võimalik kuidagi määrata Eclipse'is kasutatavaks kompilaatoriks MinGW? Ise seadetes surfates ja muutes küll targemaks ei saanud icon_rolleyes.gif


Suured tänud vastajaile ja need, kes tahavad netist otsimist soovitada ütlen, et seda olen ma juba teinud. Need küsimused on kogutud pikema aja jooksul ja on sellised, millele tõesti ise vastust leida pole suutnud.

EDIT: Kas tõesti keegi ei oska midagigi öelda selle kohta? icon_eek.gif Või ei viitsita lihtsalt nii pikka posti süveneda? icon_confused.gif
Kommentaarid: 16 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 15
tagasi üles
vaata kasutaja infot saada privaatsõnum
mareq
HV vaatleja

liitunud: 16.04.2003




sõnum 01.02.2008 20:23:51 Re: Qt's mõned probleemid ja küsimused vasta tsitaadiga

Fiocchi kirjutas:

Ehk siis kuidas kutsuda sellise signaaliga, mis ei saada arvu, slot, mis tahab argumendiks arvu?


Siinkohal aitab ehk QSignalMapper.

Fiocchi kirjutas:

Kas ja kuidas on võimalik muuta/lisada saadavas .exe failis programmi kohta käivat infot nagu versioon, kirjeldus jms info, mis windowsi programmide exe'des tavaliselt olemas on?


QCoreApplication:
tsitaat:

Properties
applicationName : QString
organizationDomain : QString
organizationName : QString


Kui sa QSettings'iga registrisse oksendad siis kasutatakse igatahes neid väärtusi. Ma ei ole kindel, kas sa täpselt seda silmas pidasid, aga tundub sarnane.

Sinu algse probleemi kohta ma ei oska hetkel midagi tarka pakkuda ja spekuleeriks vaid, et kas sul on need lineeditid mingis lihtlabases massiivis? Juhul kui on nii, siis ma soovitaks selle asemel pigem QList<T> või QMap<Key,T> kasutada, siis on veidi puhtam ja kuivem tunne.

Lisaks, et olla kindel jäägitehte õnnestumises float puhul, tasub teine argument kirjutada ka floatina, ehk sinu koodis:

if(ssum % 10 != 0)

asemel

if(ssum % 10.0 != 0.0)


Lisaks on float tüübi puhul võrdlustehted sellised....imelikud...

Fiocchi kirjutas:

Kas on võimalik teha Excel'i faili(.xls) Qt's? Praegu olen sunnitud kasutama taktikat, kus teen oma andmetest tabeli .txt faili, mille siis saan excel'isse importida. Võiks olla parem võimalus.

Sellist nalja Qt standardvahenditega minu teada teha ei õnnestu, pead ise mingi variandi kokku keevitama. Vahepealne variant oleks näiteks .csv failid teha, ehk? Neid õnnestub excelile ka võrdlemisi valutult ette sööta.
Kommentaarid: 2 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 2
tagasi üles
vaata kasutaja infot saada privaatsõnum
Fiocchi
HV kasutaja
Fiocchi

liitunud: 04.01.2005




sõnum 07.02.2008 22:23:34 Re: Qt's mõned probleemid ja küsimused vasta tsitaadiga

mareq kirjutas:
Siinkohal aitab ehk QSignalMapper.

Vot midagi sellist ma otsisingi. Väga hea. Peab katsetama hakkama.

mareq kirjutas:
QCoreApplication:
tsitaat:

Properties
applicationName : QString
organizationDomain : QString
organizationName : QString


Kui sa QSettings'iga registrisse oksendad siis kasutatakse igatahes neid väärtusi. Ma ei ole kindel, kas sa täpselt seda silmas pidasid, aga tundub sarnane.

Ei seda ma ilmselt ei mõelnud. Selle otsa komistasin ise ka juba varem. Registriga ma tegemist ei tee. Ma mõtlesin seda kirjeldust, mis on näha faili nime all teisel ja kolmandal real(explorer'i aknas) ning kui paremklikiga avanevast menüüst "properties" valida, on teiste programmide .exe'del seal aknas olemas sakk "version", kus on eelmainitud info. Qt's tehtutel see sakk puudub.

mareq kirjutas:
Sinu algse probleemi kohta ma ei oska hetkel midagi tarka pakkuda ja spekuleeriks vaid, et kas sul on need lineeditid mingis lihtlabases massiivis? Juhul kui on nii, siis ma soovitaks selle asemel pigem QList<T> või QMap<Key,T> kasutada, siis on veidi puhtam ja kuivem tunne.

Lisaks, et olla kindel jäägitehte õnnestumises float puhul, tasub teine argument kirjutada ka floatina, ehk sinu koodis:

if(ssum % 10 != 0)

asemel

if(ssum % 10.0 != 0.0)


Lisaks on float tüübi puhul võrdlustehted sellised....imelikud...

Neid asju peab veel katsetama icon_razz1.gif

mareq kirjutas:
Fiocchi kirjutas:

Kas on võimalik teha Excel'i faili(.xls) Qt's? Praegu olen sunnitud kasutama taktikat, kus teen oma andmetest tabeli .txt faili, mille siis saan excel'isse importida. Võiks olla parem võimalus.

Sellist nalja Qt standardvahenditega minu teada teha ei õnnestu, pead ise mingi variandi kokku keevitama. Vahepealne variant oleks näiteks .csv failid teha, ehk? Neid õnnestub excelile ka võrdlemisi valutult ette sööta.
.csv fail minu arusaamise järgi ei sobi, kuna mul on tegemist ju komadega arvudega, see ajaks ilmselt asja sassi, kuna arvude komad läheks eraldajatega segi. Või olen ma millesti valesti aru saanud?
Ise mõtlesin muidu välja veel sellise variandi. Tabel, mis luua tuleb on alati sama, lihtsalt sisu on sel erinev. Seega oleks vast võimalik teha algul Excel'is nn mustand, milles pärast õige koha peal lihtsalt sissekanded ära muuta. Probleem tekkis aga faili programmi sisse lugemisega. Proovisin standardset ifstream'i kasutada, sellega aga ei suutnud failist ridu niimoodi kätte saada, et ka õiged tühikud jms asjad õigetele kohtadele jääks. getline() luges ainult pisikese jupi algusest ja sinna asi jäigi icon_confused.gif
Kommentaarid: 16 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 15
tagasi üles
vaata kasutaja infot saada privaatsõnum
Urmet
HV vaatleja

liitunud: 29.07.2005



Autoriseeritud ID-kaardiga

sõnum 08.02.2008 15:24:08 Re: Qt's mõned probleemid ja küsimused vasta tsitaadiga

Fiocchi kirjutas:
.csv fail minu arusaamise järgi ei sobi, kuna mul on tegemist ju komadega arvudega, see ajaks ilmselt asja sassi, kuna arvude komad läheks eraldajatega segi. Või olen ma millesti valesti aru saanud?
Ise mõtlesin muidu välja veel sellise variandi. Tabel, mis luua tuleb on alati sama, lihtsalt sisu on sel erinev. Seega oleks vast võimalik teha algul Excel'is nn mustand, milles pärast õige koha peal lihtsalt sissekanded ära muuta. Probleem tekkis aga faili programmi sisse lugemisega. Proovisin standardset ifstream'i kasutada, sellega aga ei suutnud failist ridu niimoodi kätte saada, et ka õiged tühikud jms asjad õigetele kohtadele jääks. getline() luges ainult pisikese jupi algusest ja sinna asi jäigi icon_confused.gif
kirjutad "komadega arvud" faili punktikestega. icon_rolleyes.gif
4.2,6.9,13.0
umbes nii siis. paistab mulle küll piisavalt viisakas
Kommentaarid: 10 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 10
tagasi üles
vaata kasutaja infot saada privaatsõnum
marqs
HV veteran
marqs

liitunud: 06.12.2001




sõnum 09.02.2008 00:40:27 vasta tsitaadiga

Kui seda csv'd vaid Exceli tarvis vaja, siis võib seal eraldajaks koma asemel kasvõi ångström olla.
Muide Exceli tarvis oleks abiks kõik väärtused juba failis jutumärkide vahele panna, see raip kipub muidu liialt palju omaloomingut tegema, arvudest kuupäevasid ja muud jama leiutama.
Siis ei tohiks enam ka kohaliku täis- ja murdosa separaatori kasutamisest probleeme tekkida:
'1,123','2,234','3,345'

_________________
0xDEAD
0xBEEF
Kommentaarid: 28 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 27
tagasi üles
vaata kasutaja infot saada privaatsõnum
Fiocchi
HV kasutaja
Fiocchi

liitunud: 04.01.2005




sõnum 15.07.2008 21:50:34 vasta tsitaadiga

No kui ei ole erilist vahet mis eraldajaks on, kas siis tuleb ikkagi excel'is import'i kasutada? Kui jah siis ei ole ju vahet kas ma impordin ta .txt failist kus eraldajaks tab või millestki muust.

Muidu sellest põhi veast sain lõpuks lahti. Lihtsalt asendasin rea:
sum += (tabel->lask[j][i]->text().toFloat(&onnestus)*10);

ridadega
arv = tabel->lask[j][i]->text().toFloat(&onnestus);
arv *= 10;
sum += arv;
kus arv on float ja sum on int. Iseenesest lihtne, aga ei tuld kohe selle peale.



UUS KÜSIMUS:
Niih, kaevan siis vana teema üles. Järjekordselt ei saa asjadega hakkama. Seekord asi selles, et vaja QTabWidget'ile lisada tab'ideks oma custom widgeteid(Leht'i). Samas vaja selle Leht klassi funkstsiooni välja kutsuda. Mõtlesin siis välja enam-vähem sellise süsteemi:
QTabWidget *tabWidget;
QList<Leht *> lehed;

tabWidget = new QTabWidget(this);
setCentralWidget(tabWidget);
lehed << new Leht(tabWidget);
tabWidget->insertTab(0, lehed[0], "Esimene");
Selle peale ütleb KDevelop "Segmentation fault, exited with status 139". Terminalis make käskluse peale tuleb vastuseks:
In file included from main.cpp:1:
protokollitaja.h:29: error: `*' cannot appear in a constant-expression
protokollitaja.h:29: error: template argument 1 is invalid
make[1]: *** [release/main.o] Error 2
make[1]: Leaving directory `/home/kasutaja/Katsepolygon/Protokollitaja'
make: *** [release] Error 2
Too rida 29 ongi QList<Leht *> lehed;
Kas seega siis ei ole võimalik luua uusi tab'e andes widgeti'i pointerina sellist viita, mis on juba kuskil olemas? Kas vanema muutumine selle protsessi käigus rikub asja ära või mis?
Muidu tabWidget->insertTab(0, new Leht(this), "Esimene") töötab, aga ei rahulda mind, kuna on vaja ligi pääseda aktiivsel tab'il oleva lehe funktsioonidele, misjaoks ma ka selle pointerite listi välja mõtlesin.
Kommentaarid: 16 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 15
tagasi üles
vaata kasutaja infot saada privaatsõnum
näita postitusi alates eelmisest:   
uus teema   vasta Tarkvara »  Programmeerimine »  Qt's mõned probleemid ja küsimused
[vaata eelmist teemat] [vaata järgmist teemat]
 lisa lemmikuks
näita foorumit:  
 ignoreeri teemat 
sa ei või postitada uusi teemasid siia foorumisse
sa ei või vastata selle foorumi teemadele
sa ei või muuta oma postitusi selles foorumis
sa ei või kustutada oma postitusi selles foorumis
sa ei või vastata küsitlustele selles foorumis
sa ei saa lisada manuseid selles foorumis
sa võid manuseid alla laadida selles foorumis



Hinnavaatlus ei vastuta foorumis tehtud postituste eest.