QT4 Multilang

Elkezdtem ismerkedni a QT-vel egy arm lapon (azzal ami rajta volt (QT4), mivel sosem programoztam még QT-ben sőt a C/C++ sem az erősségem, ráadásul egy példaprogramból építettem egy kódot amit majd valahogy QT5-re kell később átalakítanom (vagy kidobni az egészet és valami teljesen másra építeni), de ez most másodlagos (ha esetleg van valami (fél)automatizált mód, azt megsúghatnátok)) így későn jöttem rá, hogy rossz az irány. A baj, hogy a program már működik, teszi a dolgát, a GUI-val küzdök még kicsit, nem szeretném kidobni és elölről kezdeni.

Van mainwindow, settings, adjust, progress stb... „ablakaim”. A nyelv váltást a settingsben végzi és azonnal vált is a 3 megadott nyelv között, de ahogy visszalépek a kezdőablakon marad az indításkori nyelv, viszont a progressben a statikus szöveg indításkori nyelven marad a dinamikus pedig a beállítotton, de ha rányomok egy gombra akkor azon hol az egyik hol a másik jelenik meg, szóval nagy a kavar és a futásidejű nyelv váltásra amúgy sincs szükség.

Volna egy ötletem, de fogalmam sincs, hogyan tudnám megoldani. A lényeg, hogy ez a gép a bekapcsoláskor rögtön ezt a programot indítja, nincs más hozzáférés közvetlenül (konzolon ssh-val lehet ezen kívül hálózatról)
Szeretnék egy inicializáló ablakkal kezdeni (ez lenne a már meglévő settings), ahol a főbb paramétereket lehetne beállítani, pl. a GUI nyelvét is, ezeket eltárolni és a legközelebbi indításkor ne ez az ablak induljon, hanem a főablak, ahonnan akár ezt is el lehet érni (lévén ő a settings). Arra gondoltam, hogy indításkor keresek egy .config_app fájlt és ha nem létezik, akkor a program a settings-el indul, ha létezik akkor pedig a mainwindow lesz az alapértelmezett. Valaki esetleg futott már bele ilyesmibe vagy ismer ilyen projektet? (a lényeg az lenne, hogy meg is ismerjem, hogy miért csinálja, így valami kisebb kód lenne jó, amit a csekély tudásommal átlátok. Hetek óta keresgélek, próbálgatok ki programokat, de a kódbázis mindnél túlmutat a jelenlegi képességeimen) Ezen túl van még egy wiringpi problémám, a konzolos teszten működik a felhasználóval, de a guis program kilép azzal, hogy root jogot szeretne...

Hozzászólások

FYI: a Qt4 - Qt5 migráció a legtöbb esetben fájdalommentes.

Végülis... Ha a működése rendben van, nem feltétlenül fogok QT5 után nyújtózkodni. A nagy lendülettel elkezdett progim vezérlés része működik akár bash-ból is vagy pythonból csak akartam rá egy szebb kabátot, hátha esetleg termék lehet belőle egyszer. Ezt pofozgatom most és szívem szerint még az X-et is kihagynám a dologból, de a QT Creator meg Designer fenn volt, találtam is olyan példákat amik eléggé egyszerűek és majdnem azt a kinézetet nyújtják amit szeretnék. Alakítgattam így most itt tart, kár, hogy nem fér el minden 800x480-on egy ablakban, akkor csak az utolsó állapotot kellene eltárolnom, hogy azzal induljon és nem kellene bűvészkednem a fenti problémámmal :) Van amit kis projektekben nem találtam (hogy meg is értsem a működését) és kérdeznem kell :( A GUI-t vnc-ről vagy saját kijelzővel is el lehet érni, egyenlőre elég lenne, szóval a QT5-öt csak azért gondoltam, mert egy régebbi verzióval kezdtem a modern aktuális helyett. A különbségekről fogalmam sincs azon túl, hogy qmake kell és kicsit más a felépítése egy programnak.

--
„- Mindig azt akartam, hogy a számítógépem ugyanolyan könnyen használható legyen, mint a telefonom. A kívánságom valóra vált. Már nem tudom, hogyan kell használni a telefonomat.”

dzsolt

Hát azt nem írtad le, hogy konkrétan mit csinál a programod, de ha akár bash-ból is lehetne vezérelni és csak hm...marketing okokból akarsz rá GUI-t, akkor lehet, hogy nem a komplex Qt4-gyel kellene kezdeni a GUI építést. A Qt4 ugyanis messze több, mint egy egyszerű GUI toolkit, ez egy rendkívül kiterjedt és sokoldalú keretrendszer, amivel rengeteg dolgot meg lehet csinálni, de ezzel párhuzamosan többet is kell tanulni hozzá és a rendszerigényei is magasabbak egy mezei GUI toolkitnél. A Qt5 ugyanez, csak szteroidokon.

Amennyiben a GUI-n kívül tényleg nincs szükséged most másra, viszont azt baromi egyszerűen szeretnéd kezelni, akkor jó szívvel ajánlom az XForms Toolkit-et. Egy raklap példa van hozzá és annyira kézenfekvő módon kell programozni, hogy azonnal megérti bárki. Meglehetősen kiterjedt widgetkészlettel és OpenGL támogatással is bír, ami pedig a rendszerigényt illeti, még a Motifnál és a GTK1-nél is lightweight-ebb.

Ezzel párhuzamosan érdemes lenne az ncurses toolkitet is tanulmányozni. Ezzel terminálban használható GUI-t lehet építeni és az pl. sose árt egy terméknek, ha esetleg terminálból is lehet kényelmesen vezérelni.

Ez egy Pan-Tilt egy sínen fényképezőkhöz (PhotoDolly). Jelenleg a sín még nincs kész, de az csak pár sor plussz, nekem még eddig nem kellett, de tetszenek a sínről készített time-laps felvételek. Üzemmódjai jelenleg panoráma és asztropanoráma. Meg lehet adni a szenzor adatait, fókusztávolságot, átlapolást, kívánt felvételi szögeket, lépések számát fokonként, van kézi pozícionálás nullpont beállításhoz, kiszámolja, hogy a panoráma hányszor hány képből készül és folyamatában jelzi, hogy hol tart, stb... Egyenlőre unipoláris motorokkal, bár lehet, hogy ezt is elszúrtam, mert nem kerül sokkal többe egy hw a step/dir rendszerre és akkor akár bármekkora motorokkal is olcsón bővíthető lenne. A konkrét hw egy bananapi zero H2-es procival, wiringpi-vel (ehhez most fordul az új kernel, mert talán az a jogosultságok problémájának az oka). Terepre nem akarok laptopot vinni, de egy vnc bármilyen telefonon elfut, így a terminál GUI nem szükséges. Termuxból elérem ha nagy a gáz, de eddig elég stabilnak bizonyult amióta hűtőbordát kapott a proci (előtte voltak bajok, nem biztos, hogy a banana a legjobb választás volt, de már megvan :) ).
A programozás ilyen téren teljesen új dolog számomra, valamikor még a 2.x.x kernelek környékén tanultam egy kis C-t Akkor még a kernelt lehetett simán dd-vel floppyra írni, hogy pár bájt helyet nyerjek :D ) aztán kb 2x évig nem használtam (és most belenézve a kódba, nem változott a stílusom, a kommenteket még mindig elfelejtem, tele a forráskód részletekkel amit kizártam a fordításból a kísérletezések során, de valamiért nem törlöm sosem :)
Hogy miért pont QT? Kerestem valamit ami kényelmes és a QT Creator/Designer/Linguist kényelmes és komplex, nem kell vadászgatni a csomagokat hozzá. Ha teljesen elkészült, ránézek az XForms-ra. Ha sosem lesz belőle termék, akkor jót játszottam, nekem megérte, bár érdeklődés már volna, ha nem parancssoros a kezelőfelület. Szóval így áll most.

--
„- Mindig azt akartam, hogy a számítógépem ugyanolyan könnyen használható legyen, mint a telefonom. A kívánságom valóra vált. Már nem tudom, hogyan kell használni a telefonomat.”

dzsolt

A Pascalról hallottam már, hogy van, de kb. ennyi. C-t használtam valaha, kerestem hibát és vissza is küldtem a kódot (el is fogadták), de soha nem voltam belőle profi.
--
„- Mindig azt akartam, hogy a számítógépem ugyanolyan könnyen használható legyen, mint a telefonom. A kívánságom valóra vált. Már nem tudom, hogyan kell használni a telefonomat.”

dzsolt

A program nyelvét vagy a rendszer LANG környezeti változóból töltöd be, vagy ahogy már fent említették lehet egy külön beállítás is.
Mindkettőre talász példát itt http://hyperprog.com/hypercalc/hypercalc-source-1.21.zip
A main.cpp -t nézd meg, abban szinte csak ez a nyelvválasztós rész van.
Windows alatt a beállításos rész fut (Q_WS_WIN), linux alatt a környezeti változós.

Köszönöm! Gondoltam én is a rendszer nyelvének használatára, talán egyszerűbb is lenne, mint csak a program nyelvét változtatni. Ráadásul nyelvet ritkán vált az ember, az alatta futó linux pedig mindet ismeri. Az első bekapcsolásra különvenném a settingst, úgy is be kell állítgatni ezt-azt, majd ha egyszer lefutott, átnevezné az indítandó program nevét és azután a programból lenne elérhető a beépített. Kívülről (felhasználói szemszögből) nem is látszana, hogy két külön program, hisz ugyan az futna le csak gondoltam elegánsabb megoldás is létezik.

--
„- Mindig azt akartam, hogy a számítógépem ugyanolyan könnyen használható legyen, mint a telefonom. A kívánságom valóra vált. Már nem tudom, hogyan kell használni a telefonomat.”

dzsolt

HA nem baratod a c/c++ akkor miert nem hasznalod a python-qt-t?

Mert a léptetővezérlőt és a számolásokat C-ben írtam (ahelyett, hogy szétnéztem volna a step/dir felé) és alig kellett változtatni, lefordult és a motorok mozognak. Persze még össze kell raknom a vasat, hogy lássam oda fordul ahová kell neki :D A GUI-hoz keresgéltem valami példa projektet és amit találtam QT-Creatorral C++-ban volt (díszítés nélküli ablakok, kicsi, áttekinthető kódot kerestem, amin tanulhatok is), szerencsémre kicsi módosítás után használni is tudtam (bár most a QSettings óta lefordíthatatlan állapotba hoztam :D ). De most az itt ajánlott XForms-Toolkit is megtetszett, következő lépés az lesz, csak itt már pár lépés hiányzik a célig! Működjön és kipróbálok mindent amit javasoltok :)
Régóta használok linuxot (gentoo-t), de a napi programozásra sosem volt szükségem. Picit használnom kellett (leginkább magam miatt) C-t, a shelleket, pythont, azelőtt basicet, még azelőtt Z80 assembly-t, így ezekbe a kódokba beleolvasva van fogalmam a működésről, de hiányos és halvány ismereteim miatt mindet tanulnom kell. A jövőben sem kívánok programozásból élni, de azt a pár dolgot amit használok a magam képére akarom formálni. Ha esetleg valami jobbra sikerül és eladható, akkor meg jönnek a licencelési kérdések stb... Ehhez már öreg vagyok, bár meglepett, hogy az ismerősi körben rögtön lecsaptak rá, mintha már lenne kész termékem :D ezért megpróbálom olyanná tenni, ami elvárható egy ilyen eszköztől, aztán meglátjuk...

--
„- Mindig azt akartam, hogy a számítógépem ugyanolyan könnyen használható legyen, mint a telefonom. A kívánságom valóra vált. Már nem tudom, hogyan kell használni a telefonomat.”

dzsolt

En azert valtottam a python-ra, mert azt tudom a legtobb helyen hasznalni. Neha kampanyszeruen ujratanulok valamit, legutobb a c++ volt, baromira elveztem. De annyira feladatspecifikus (esp-re hasznaltam), hogy ha nem dolgozom azon a projectemen, akkor eleg gyorsan kopik.
Ugyhogy marad a python, mert azt legalabb napi szinnten hasznalom.

Esp-n amúgy is freertos van micropythonnal ha jól emlékszem. Van 2db a fiókban, még nem vetettem bele magam. Nekem az ilyen kütyükre egy bash lenne jó, vagy minimum egy sh :) Olyan lekérdezéseket csinálok, amit egy pc-n simán shellből le lehet kezelni, nem kell se realtime, se semmi extra. Egy smarthome simán mehetne sh-ból.
Nézegetem a pythonqt-t, sdl-el ez se lenne rossz. A baj, hogy ebbe már beleugrottam így és nem hagy nyugodni, de ebből a topicból kaptam jó tippeket a jövőre nézve. Amúgy a Qt tényleg ágyúval verébre most.

--
„- Mindig azt akartam, hogy a számítógépem ugyanolyan könnyen használható legyen, mint a telefonom. A kívánságom valóra vált. Már nem tudom, hogyan kell használni a telefonomat.”

dzsolt

T-t, bocsánat, erre tényleg nem figyeltem :(

Az examplesben nálam nincs semmi, gondolom telepíteni kellene, de amúgy ez nem egészen az amit szeretnék.
http://kepkezelo.com/images/bzkvxb6ll0ns6xmv0bc0.png
Így néz ki most. Semmi ablak dekoráció, nincsenek menük csak katt a gombra és ebben az egy dialogban azonnal váltja a nyelvet (ami amúgy felesleges, mert ki váltana nyelvet munka közben? A gyutáv még bennmaradt, de áttettem a főablakba is, ahol a szenzort és a kívánt látószöget állítom, mert azt inkább onnan logikus, sűrűbben változhat. Innen majd törlöm vagy kap más funkciót.) Jelenleg nem tárolok külső fájlban konfigot (valamit elkevertem a QSettings-el, mert most épp le sem fordul :D) , egy a programba írt alapértékkel jön minden, induláskor. Semmiféle Boxot nem szeretnék, ne ugráljon fel semmi, ne nyíljon le semmi, tényleg puritán, célirányos felületet szeretnék. Ami ennél puritánabb az már Arduino pontmátrixos kijelzővel :D (Amúgy egy példából betettem egy infóboxot, alig tudtam tőle megszabadulni :D Illetve megszabadulni csak-csak, de a kiírást másképp kezelni okozott pici akadást). Amint írtam, nekem ez most játék/tanulás/szórakozás, így minden tippnek örülök, ennek is. Köszönöm!

--
„- Mindig azt akartam, hogy a számítógépem ugyanolyan könnyen használható legyen, mint a telefonom. A kívánságom valóra vált. Már nem tudom, hogyan kell használni a telefonomat.”

dzsolt

Hol akadtál el ?

A projekthez le tudtad generálni a qm fájlokat nyelvenként ?
Gondolom igen, mert vált futásidőben. Akkor már a nehezén túl vagy.
A settings meg kb ennyi:
main.cpp:


#include "MainWindow.h"
#include <QApplication>
#include <QTranslator>
#include <QSettings>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QSettings settings("tr.conf", QSettings::NativeFormat);
    QString lang = settings.value("lang").toString().toLower();

    QTranslator t;
    t.load(":/"+lang+".qm");
    a.installTranslator(&t);
    MainWindow w;
    w.show();

    return a.exec();
}

tr.conf:


[General]
lang=hun

Ez így az alkalmazás indítása előtt betölti a configban beállított nyelvet.
Ez Qt5 alatt van, de nem térhet nagyon el Qt4-nél sem.
ui: a config legyen a futtatható fájl mellett a qm fájlokat ha nem resource-ként kezeled akkor nem kell elé a ':' és tedd azokat is a bináris mellé.

Nem főállásban írom, így mikor időm van akkor pofozgatom. Néztem a Qt oldalán az itt megosztott linkről a QSettingst és az alapján írtam bele, egyenlőre csak egy érték elmentését. Közben valamit kitörölhettem (vagy beírhattam másik ablakból véletlenül), mert nem azon a Dialog-on dob hibát, hanem a főablak fordítása közben. Ez nem gond, holnap visszanézem a korábbi módosításaim és meglesz a hiba.

A qm-ek és a ts-ek természetesen megvannak, nem csak a Designer által generáltak, hanem a forrásban lévők is így szerencsémre megoldódott egy karakterkódolási gondom is (teljesen magától, esküszöm nem tettem érte semmit :D. Valószínűleg nem tett jót neki, hogy 2 helyről szerkesztettem az elején a programot és valami félre ment, pedig szerintem mindenen utf8-at használok. Azóta nem kutyulom!) Láttam más projekteknél, hogy külön könyvtár van a nyelvi fájloknak, de láttam már így is ahogy nálam van, hogy egyben van az összes. Van ennek jelentősége? Gyakorlatilag a kész program most 3 fájlból áll, a program és a két nyelvi fájl. Ehhez jön még a config, akkor lesz 4, nem nagyon lehet eltévedni közöttük. A configba ki szeretném az összes állítható változót menteni és lenne pár amit fixen csak onnan töltenék be, ezzel egyúttal pár bejegyzés eltűnne a guiból és talán egy komplett dialog ablakot is meg tudok spórolni ha átszervezem.

--
„- Mindig azt akartam, hogy a számítógépem ugyanolyan könnyen használható legyen, mint a telefonom. A kívánságom valóra vált. Már nem tudom, hogyan kell használni a telefonomat.”

dzsolt

Valószínűleg nem tett jót neki, hogy 2 helyről szerkesztettem az elején a programot és valami félre ment, pedig szerintem mindenen utf8-at használok. Azóta nem kutyulom!)

Qt4-nél célszerű a következőeket beállítani:


#include <QtGui/QApplication>
#include <QtCore/QTextCodec>
#include "mainwindow.h"

int main(int argc, char *argv[])
{

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