Kirjautuminen

Haku

Tehtävät

Keskustelu: Projektit: Lazybrowse

mylvari [21.05.2012 13:18:04]

#

Lazybrowse on ohjelma joka säilöö linkkejä Sqlite-tietokantaan myöhempää käyttöä varten. Esimerkiksi RSS-syötteidenlukijasta voi naksutella kiinnostavia artikkeleita muistiin ja myöhemmin avata ne kaikki web-selaimeen.

Projektin päämaja on Githubissa joka hyödyntää Git-versionhallintajärjestelmää. Arch Linuxin käyttäjät ovat onnekkaita, koska he voivat asentaa ohjelman käyttäen Makepkg:lle sopivaa PKGBUILDia.

Esimerkki ohjelman käytöstä:

lazybrowse -a https://www.ohjelmointiputka.net/
lazybrowse -e firefox
lazybrowse --hideall

Projekti on ensimmäinen Pythonilla tekemäni kokonainen ohjelma. Kaipaisin siis neuvoa ainakin seuraavissa asioissa:

* Millaisia tyylivirheitä ja muuta huomautettavaa koodista mahdollisesti löytyy?
* Miten/millä tuohon olisi järkevintä toteuttaa GUI?

bmi [25.05.2012 12:45:39]

#

Graafinen käyttiittymä myös Pythonilla? Esim. PyGTK, Tkinter tai Wxpython toimii.

The Alchemist [26.05.2012 07:45:06]

#

En käyttäisi mitään äsken mainituista vaan ottaisin PyQt:n.

mylvari [31.05.2012 13:38:48]

#

PyQt vaikutti mukavalta ja tuetulta, joten valitsin sen.

Jonkinlaisen tekeleen sainkin tehtyä, mutta uskon tehneeni jotakin väärin. Esitän datan TableView-luokan avulla, ja valittuina olevat osoitteet saan selville käyttäjällekin näkyvästä tunnistenumerosta. Onkohan tämä paras tapa?

Koodi on toistaiseksi niin lyhyt, että tarvittavat kohdat kahlaa helposti lävitse kahdesta tiedostosta: Itse käyttöliittymän koodi ja PyUicilla generoitu pohja

The Alchemist [31.05.2012 15:57:09]

#

Ilmeneekö häröjä vai miksi veikkaat tehneesi jotain väärin? Ainakin sen verran korjaisin, että käyttäisin dokumentaationkin suosittelemia beginInsertRows()- ja beginRemoveRows()-metodeja, kun malliin lisätään rivejä tai niitä poistellaan. Perusnäkymien kanssa sillä ei välttämättä ole (näkyvää) vaikutusta, mitä kutsuu, mutta veikkaisin että noiden resetModel-metodien jälkeen näkymä voi lukea koko mallin datan uusiksi, mikä on laskennallisesti raskaampaa kuin vain päivitysten lisääminen näytölle.

Myös tuo LazyBrowserMainFormin periytyminen pyuicin tuotoksesta voi aiheuttaa ongelmia (ainakin C++:n kanssa aiheuttaisi), sillä se lomake ei (C++:n kanssa) periydy QObjectista, joten sille ei voi slotteja määritellä.

Olisin itse laittanut pyuicin tuottaman lomakkeen memberiksi LazyBrowseGui-luokalle ja sen konstruktorissa tehnyt setupin kutsulla 'self.form.setupUi(self)' ja samalla siirtänyt kaiken muun alustuskoodin tuolta lomakkeesta LazyBrowseGuin konstruktoriin.

mylvari [31.05.2012 16:55:13]

#

The Alchemist kirjoitti:

Ilmeneekö häröjä vai miksi veikkaat tehneesi jotain väärin? Ainakin sen verran korjaisin, että käyttäisin dokumentaationkin suosittelemia beginInsertRows()- ja beginRemoveRows()-metodeja, kun malliin lisätään rivejä tai niitä poistellaan. Perusnäkymien kanssa sillä ei välttämättä ole (näkyvää) vaikutusta, mitä kutsuu, mutta veikkaisin että noiden resetModel-metodien jälkeen näkymä voi lukea koko mallin datan uusiksi, mikä on laskennallisesti raskaampaa kuin vain päivitysten lisääminen näytölle.

Lähinnä pidän hieman "likaisena" ratkaisuna sitä, että käyttäjälle näytetään tarkoituksettomia numeroita jotka ovat pakollisia ohjelman sisäiselle toiminnalle.

Ilmeisesti asian pitäisi olla niin, että modelille annetaan käsiteltävän elementin rivinumero ja model sitten etsii sen perusteella varsinaisen elementin?

The Alchemist kirjoitti:

Myös tuo LazyBrowserMainFormin periytyminen pyuicin tuotoksesta voi aiheuttaa ongelmia (ainakin C++:n kanssa aiheuttaisi), sillä se lomake ei (C++:n kanssa) periydy QObjectista, joten sille ei voi slotteja määritellä.

Olisin itse laittanut pyuicin tuottaman lomakkeen memberiksi LazyBrowseGui-luokalle ja sen konstruktorissa tehnyt setupin kutsulla 'self.form.setupUi(self)' ja samalla siirtänyt kaiken muun alustuskoodin tuolta lomakkeesta LazyBrowseGuin konstruktoriin.

Ohjelma kuitenkin toimii ilman virheilmoituksia. Mikähän sen selittäisi?

The Alchemist [31.05.2012 22:38:21]

#

mylvari kirjoitti:

The Alchemist kirjoitti:

Ilmeneekö häröjä vai miksi veikkaat tehneesi jotain väärin? Ainakin sen verran korjaisin, että käyttäisin dokumentaationkin suosittelemia beginInsertRows()- ja beginRemoveRows()-metodeja, kun malliin lisätään rivejä tai niitä poistellaan. Perusnäkymien kanssa sillä ei välttämättä ole (näkyvää) vaikutusta, mitä kutsuu, mutta veikkaisin että noiden resetModel-metodien jälkeen näkymä voi lukea koko mallin datan uusiksi, mikä on laskennallisesti raskaampaa kuin vain päivitysten lisääminen näytölle.

Lähinnä pidän hieman "likaisena" ratkaisuna sitä, että käyttäjälle näytetään tarkoituksettomia numeroita jotka ovat pakollisia ohjelman sisäiselle toiminnalle.

Ilmeisesti asian pitäisi olla niin, että modelille annetaan käsiteltävän elementin rivinumero ja model sitten etsii sen perusteella varsinaisen elementin?

En oikein ymmärrä, että mistä vaiheesta sinä edes puhut. TableView käyttää modeleiden standardia rajapintaa (rowCount(), index(), getData(), ...) mallin lukemiseen. Periaatteessa sinun olisi hyvä koodata kaikki omat metodisi tämän rajapinnan ympärille, kun nyt et ole toteuttanut setData()-metodia ollenkaan, joten mallisi on standardin rajapinnan näkökulmasta vain luku -tilassa.

ItemModeleiden kanssa ei käytetä rivinumeroita vaan indeksejä eli (x,y)-pareja (QModelIndex-luokka). Voit toki koodata lisäksi ns. kätevyysfunktioita, jotka palauttavat pelkän rivinumeron perusteella.

Rivin piilottamiseen olisin käyttäny proxy modelia (QSortFilterProxyModel), joka filtteröisi rivejä esimerkiksi sen perusteella, onko niillä Status-sarakkeessa arvona 0 (hidden) vai 1 (visible). Proxy-mallin avulla voit myös suotia turhat sarakkeet pois tai vaikka muutenkin piilottaa ne viewin päässä (myView.horizontalHeader().hideSection(i)). Tai tuo hidden/visible voisi olla vaikka tallennettuna johonkin muuhun (itse määritettyyn) ItemDataRoleen kuin Qt.DisplayRole, jolloin ylimääräistä saraketta ei alun alkaenkaan tarvita.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta