abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    dnes 03:33 | Zajímavý článek

    Mozilla před dvěma týdny na svém blogu oznámila, že díky Claude Mythos Preview bylo ve Firefoxu nalezeno a opraveno 271 bezpečnostních chyb. Včera vyšel na Mozilla Hacks článek s podrobnějšími informacemi. Z 271 bezpečnostních chyb mělo 180 chyb vysokou závažnost, 80 chyb střední závažnost a 11 chyb nízkou závažnost. Celkově bylo v dubnu ve Firefoxu opraveno 423 bezpečnostních chyb. Čísla CVE nemusí být přiřazována jednotlivým chybám. CVE-2026-6784 například představuje 154 bezpečnostních chyb.

    Ladislav Hagara | Komentářů: 0
    včera 22:55 | Bezpečnostní upozornění

    Před týdnem zranitelnost Copy Fail. Dnes zranitelnost Dirty Frag. Běžný uživatel může na Linuxu získat práva roota (lokální eskalaci práv). Na většině linuxových distribucí vydaných od roku 2017. Aktuálně bez oficiální záplaty a CVE čísla [oss-security mailing list].

    Ladislav Hagara | Komentářů: 0
    včera 14:00 | Humor

    Ačkoli je papež Lev XIV. hlavou katolické církve a stojí v čele více než miliardy věřících po celém světě, také on někdy řeší všední potíže. A kdo v životě neměl problémy se zákaznickou linkou? Krátce poté, co nastoupil do úřadu, musel papež se svou bankou řešit změnu údajů. Operátorka ale nechtěla uvěřit, s kým mluví, a Svatému otci zavěsila.

    Ladislav Hagara | Komentářů: 7
    včera 05:11 | Nová verze

    Incus, komunitní fork nástroje pro správu kontejnerů LXD, byl vydán ve verzi 7.0 LTS (YouTube). Stejně tak související LXC a LXCFS.

    Ladislav Hagara | Komentářů: 0
    včera 05:00 | Nová verze

    Google Chrome 148 byl prohlášen za stabilní. Nejnovější stabilní verze 148.0.7778.96 přináší řadu novinek z hlediska uživatelů i vývojářů. Vypíchnout lze Prompt API (demo) pro přímý přístup k AI v zařízení. Podrobný přehled v poznámkách k vydání. Opraveno bylo 127 bezpečnostních chyb. Vylepšeny byly také nástroje pro vývojáře.

    Ladislav Hagara | Komentářů: 0
    6.5. 16:44 | Komunita

    Richard Hughes oznámil, že po společnostech Red Hat a Framework a organizacích OSFF a Linux Foundation, službu Linux Vendor Firmware Service (LVFS) umožňující aktualizovat firmware zařízení na počítačích s Linuxem, nově sponzorují také společnosti Dell a Lenovo. Do dnešního dne bylo díky LVFS provedeno více než 145 milionů aktualizací firmwarů od více než 100 různých výrobců na milionech linuxových zařízení.

    Ladislav Hagara | Komentářů: 0
    6.5. 15:22 | IT novinky

    Americké technologické společnosti Microsoft, Google a xAI souhlasily, že vládě Spojených států poskytnou přístup k novým modelům umělé inteligence (AI) před jejich uvedením na trh. Oznámila to americká vláda, která tak bude moci prověřit, zda modely nepředstavují hrozbu pro národní bezpečnost. Oznámení podtrhuje rostoucí obavy Washingtonu z rizik spojených s výkonnými AI systémy. Americké úřady chtějí v rámci předběžného přístupu

    … více »
    Ladislav Hagara | Komentářů: 1
    6.5. 14:11 | IT novinky

    Společnost Valve zveřejnila (GitLab) nákresy ovladače Steam Controller a puku. Pro všechny, kdo by jej chtěli hacknout nebo modifikovat, případně pro ně navrhnout nějaké příslušenství. Pod licencí Creative Commons (CC BY-NC-SA 4.0).

    Ladislav Hagara | Komentářů: 0
    6.5. 12:44 | Komunita

    PHP bylo dlouho distribuováno pod vlastní licencí – s výjimkou částí spadajících pod licenci Zend Engine. Po několikaleté práci se povedlo PHP přelicencovat na 3bodovou licenci BSD.

    Ladislav Hagara | Komentářů: 0
    6.5. 05:00 | Komunita

    Na čem pracují vývojáři webového prohlížeče Ladybird (GitHub)? Byl publikován přehled vývoje za duben (YouTube). Na Linuxu je vedle Qt frontendu nově k dispozici také GTK4 / libadwaita frontend.

    Ladislav Hagara | Komentářů: 20
    Které desktopové prostředí na Linuxu používáte?
     (14%)
     (9%)
     (2%)
     (14%)
     (32%)
     (4%)
     (7%)
     (3%)
     (16%)
     (24%)
    Celkem 1529 hlasů
     Komentářů: 30, poslední 3.4. 20:20
    Rozcestník

    Pyqt4 a použití modulu uic.

    6.6.2011 20:51 | Přečteno: 1358× | Linux | poslední úprava: 6.6.2011 20:51

    Programoval jsem pár aplikací v Pythonu s použitím PyQt. Dlouho jsem zkoumal, jaký je nejlepší způsob inicializace grafického rozhraní ze souboru *.ui vygenerovaného pomocí QDesigneru. V jinak dobré dokumentaci je tohle téma poněkud strohé. Takže tady uvedu moje poznatky.

    Základním zdrojem informací je oficiální manuál [1]. Dále jsem našel pěkný příklad v diskusním fóru [2]. V zásadě jsou dva druhy přístupu. První spočívá v tom, že soubor *.ui se přechroustá pomocí utilitky pyuic4 (nainstaluje se při instalaci PyQt) a vznikne tak pythonovský soubor, který se dá naimportovat a použít (je tedy nutný mezikrok, který se v lepším případě provádí pomocí makefile, v horším ručně). Tento způsob je v oficiální dokumentaci [1] dobře posán i s příklady. Druhý způsob je použití modulu uic (přesněji PyQt4.uic), který umožňuje dynamicky načítat přímo soubor *.ui a není potřeba žádný mezikrok. Tento způsob je v dokumentaci [1] popsán poněkud stručněji a bez příkladů. Upřednostňuji druhý způsob, který teď rozeberu.

    Zatímco v příkladech na internetu jsou krátké skripty, které nejsou psány objektově, v praxi je potřeba zapouzdřit kód do objektu, se kterým se dá pracovat odjinud. V následujících příkladech budu tedy vytvářet třídy, které stačí v ideálním případě naimportovat a jedním příkazem spustit, aniž by se člověk musel zabývat konkrétním použitím knihovny PyQt. Můj prográmek umí jenom to, že při kliknutí na tlačítko vypíše zprávu na standardní výstup.

    Dokumentace popisuje 3 způsoby použití. Bez dědění, s jednoduchou dědičností a dvojitou dědičností. Takže začneme od začátku.

    Nejdřív si vytvoříme soubor priklad.ui, který popisuje jednoduché okno aplikace, které obsahuje tlačítko (QPushButton) s názvem pushButton. Tlačítko je zatrhávací (checkable), aby se ve výpisech aspoň střídaly 0 a 1.

    Soubor priklad.ui vypadá takto.

    <?xml version="1.0" encoding="UTF-8"?>
    <ui version="4.0">
     <class>MainWindow</class>
     <widget class="QMainWindow" name="MainWindow">
      <property name="geometry">
       <rect>
        <x>0</x>
        <y>0</y>
        <width>98</width>
        <height>46</height>
       </rect>
      </property>
      <property name="windowTitle">
       <string>MainWindow</string>
      </property>
      <widget class="QWidget" name="centralwidget">
       <widget class="QPushButton" name="pushButton">
        <property name="geometry">
         <rect>
          <x>9</x>
          <y>9</y>
          <width>75</width>
          <height>23</height>
         </rect>
        </property>
        <property name="text">
         <string>PushButton</string>
        </property>
        <property name="checkable">
         <bool>true</bool>
        </property>
       </widget>
      </widget>
     </widget>
     <resources/>
     <connections/>
    </ui>
    

    Přístup bez dědičnosti.

    #!/usr/bin/env python
    import sys
    
    from PyQt4 import QtGui, uic
    
    class MyApplication:
        def __init__(self):
            pass
    
        def run(self):
            self.app = QtGui.QApplication(sys.argv)
            self.ui = uic.loadUi("priklad.ui")
            self.ui.pushButton.clicked.connect(self.method_with_some_weird_name)
            self.ui.closeEvent = self._closeEvent
            self.ui.show()
            self.app.exec_()
    
        def method_with_some_weird_name(self, value):
            print "Clicked %d" % value
    
        def _closeEvent(self, event):
            print "Close event"
            event.accept()
    
    if __name__ == '__main__':
        MyApp = MyApplication()
        MyApp.run()
    

    Výhody

    Nevýhody

    Přístup bez dědičnosti ukazuje, že není třeba bezhlavě dědit, i když to znamená práci navíc (viz výše). Pro aplikace s jednoduchým grafickým rozhraním je tento přístup vhodný.

    Jednoduchá dědičnost

    #!/usr/bin/env python
    import sys
    
    from PyQt4 import QtGui, QtCore, uic
    
    class MyApplication(QtGui.QMainWindow):
        def __init__(self):
            QtGui.QMainWindow.__init__(self)
            uic.loadUi("priklad.ui", self)
    
        def run(self):
            self.show()
            self.app.exec_()
    
        @QtCore.pyqtSlot(bool, name="on_pushButton_clicked")
        def method_with_some_weird_name(self, value):
            print "Clicked %d" % value
    
        @QtCore.pyqtSlot(bool)  # without this line the slot catches two signals: clicked() and clicked(bool)
        def on_pushButton_clicked(self, value):
            print "Clicked2 %d" % value
    
        def closeEvent(self, event):
            print "Close event"
            event.accept()
    
    
    def main():
        app = QtGui.QApplication(sys.argv)
        MyApp = MyApplication()
        MyApp.app = app
        MyApp.run()
    
    if __name__ == '__main__':
        main()
    

    Všimněte si, že při volání metody loadUi přibyl nepovinný parametr self.

    výhody

    nevýhody

    Při použití jednoduché dědičnosti získáme pohodlí. Připojení slotů se dá udělat pomocí dekorátorů (ty se můžou řetězit, takže můžeme například všechna kliknutí směřovat do jednoho slotu), předefinování vlastností hlavního okna je rovněž o chlup pohodlnější. Platíme za to silnou závislostí na Qt, takže například výběr alternativního rozhraní by se musel udělat o patro výš.

    Dvojitá dědičnost

    #!/usr/bin/env python
    import sys
    
    from PyQt4 import QtGui, QtCore, uic
    
    form, formbase = uic.loadUiType( "priklad.ui" )
    
    class MyApplication(formbase, form):
        def __init__(self):
            formbase.__init__(self)
            self.setupUi(self)  # inherited from form
    
        def run(self):
            self.show()
            self.app.exec_()
    
        @QtCore.pyqtSlot(bool, name="on_pushButton_clicked")
        def method_with_some_weird_name(self, value):
            print "Clicked %d" % value
    
        @QtCore.pyqtSlot(bool)  # without this line the slot catches two signals: clicked() and clicked(bool)
        def on_pushButton_clicked(self, value):
            print "Clicked2 %d" % value
    
        def closeEvent(self, event):
            print "Close event"
            event.accept()
    
    def main():
        app = QtGui.QApplication(sys.argv)
        MyApp = MyApplication()
        MyApp.app = app
        MyApp.run()
    
    
    if __name__ == '__main__':
        main()
    

    Oproti jednoduché dědičnosti je tu ještě komplikace s tím, že se musí předem vytvořit typy form a formbase(volání funkce loadUiType), které se pak použijí jako předek mé třídy.

    Třída formbase je třída z Qt, která je hlavním widgetem v souboru *.ui. V tomto případě to je PyQt4.QtGui.QMainWindow.

    Třída form je obyčejná třída, která dědí jenom object (je to tedy tzv. new style class), není tedy potomkem žádné třídy z Qt (to je důležité, neboť násobné dědění tříd z Qt dokumentace zakazuje [3]). Dá se říct, že při použití funkce loadUi dostanu instanci typu, který vrátí funkce loadUiType.

    výhody

    nevýhody

    V tomto případě to je použití funkce loadUiType poněkud velký kalibr, který navíc nepřinesl žádné ulehčení pro programátora. Funkce loadUiType asi najde využití ve větších aplikacích, kde je třeba vytvářet velké množství stejných oken.

    Použití dvojité dědičnosti z mého pohledu nepřináší žádný přínos oproti jednoduché dědičnosti. Aplikací, kde by byla opravdu nutná, je asi hodně málo.

    Náměty do diskuse

    V diskusi se můžete podělit o vlastní zkušenosti, případně o zkušenosti s Qt v C++. Také se nestýchejte vychvalovat autora těchto řádků.

    Zdroje:

    1. Using Qt Designer - http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/designer.html
    2. [PyQt] Examples for uic module in PyQt - http://www.riverbankcomputing.com/pipermail/pyqt/2007-April/015902.html
    3. Zákaz násobné dědičnosti tříd z Qt - http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/gotchas.html#multiple-inheritance
           

    Hodnocení: 80 %

            špatnédobré        

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    Komentáře

    Vložit další komentář

    6.6.2011 23:14 mimi.vx | skóre: 37 | blog: Mimi.VX | Praha
    Rozbalit Rozbalit vše Re: Pyqt4 a použití modulu uic.

    udělej z toho článek:)

    USE="-gnome -kde";turris
    mirec avatar 7.6.2011 08:14 mirec | skóre: 32 | blog: mirecove_dristy | Poprad
    Rozbalit Rozbalit vše Re: Pyqt4 a použití modulu uic.
    nedá se použít automatické připojení slotů a signálů (viz řádek self.ui.pushButton.clicked.connect...)

    Dá, ak sa objekt bude deidiť z QObject-u (QMetaObject.connectSlotsByName).

    K dvojitej dedičnosti by som dodal ešte veľkú nevýhodu - prvky ui sú public. U C++ sa to rieši privátnou dedičnosťou, takže tam sa dá ešte dvojitá dedičnosť tolerovať, ale v pythone radšej zvyšné spôsoby.

    Inak pekný článok, po dlhom čase niečo linuxové ;)

    LinuxOS.sk | USE="-fotak -zbytocnosti -farebne_lcd +vydrz +odolnost +java" emerge telefon
    7.6.2011 20:59 Tomáš | skóre: 31 | blog: Tomik
    Rozbalit Rozbalit vše Re: Pyqt4 a použití modulu uic.
    Dá, ak sa objekt bude deidiť z QObject-u (QMetaObject.connectSlotsByName).
    U postupu bez dědičnosti jsem chtěl opravdu nic nedědit, takže jsem oželel vymoženosti frameworku Qt.

    S tím problémem u dvojité dědičnosti--public prvky -- to záleží na použití. Třeba se najde někdo, kdo chce míchat logiku aplikace s grafickým rozhraním, a u jednoúčelových miniaplikací na tom až tak nesejde.
    7.6.2011 20:40 Non_E | skóre: 24 | blog: hic_sunt_leones | Pardubice
    Rozbalit Rozbalit vše Re: Pyqt4 a použití modulu uic.
    Pěkný článek, hned půjde do mých záložek :-)
    Only Sith deals in absolutes.

    Založit nové vláknoNahoru

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.