praegune kellaaeg 07.05.2024 00:06:15
|
Hinnavaatlus
:: Foorum
:: Uudised
:: Ärifoorumid
:: HV F1 ennustusvõistlus
:: Pangalink
:: Telekavad
:: HV toote otsing
|
|
autor |
sõnum |
|
Fiocchi
HV kasutaja
liitunud: 04.01.2005
|
27.01.2008 23:58:51
Qt's mõned probleemid ja küsimused |
|
|
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
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? Või ei viitsita lihtsalt nii pikka posti süveneda?
|
|
Kommentaarid: 16 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
0 :: |
15 |
|
tagasi üles |
|
|
mareq
HV vaatleja
liitunud: 16.04.2003
|
01.02.2008 20:23:51
Re: Qt's mõned probleemid ja küsimused |
|
|
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:
asemel
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 |
|
|
Fiocchi
HV kasutaja
liitunud: 04.01.2005
|
07.02.2008 22:23:34
Re: Qt's mõned probleemid ja küsimused |
|
|
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:
asemel
Lisaks on float tüübi puhul võrdlustehted sellised....imelikud... |
Neid asju peab veel katsetama
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
|
|
Kommentaarid: 16 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
0 :: |
15 |
|
tagasi üles |
|
|
Urmet
HV vaatleja
liitunud: 29.07.2005
|
08.02.2008 15:24:08
Re: Qt's mõned probleemid ja küsimused |
|
|
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 |
kirjutad "komadega arvud" faili punktikestega.
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 |
|
|
marqs
HV veteran
liitunud: 06.12.2001
|
09.02.2008 00:40:27
|
|
|
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 |
|
|
Fiocchi
HV kasutaja
liitunud: 04.01.2005
|
15.07.2008 21:50:34
|
|
|
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 |
|
|
|
lisa lemmikuks |
|
|
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.
|