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 14:33 | Zajímavý software

    Grafický správce balíčků Myrlyn pro SUSE a openSUSE, původně YQPkg, dospěl do stabilní verze 1.0.0. Postaven je nad libzypp a Qt 6. Projekt začal na SUSE Hack Weeku 24.

    Ladislav Hagara | Komentářů: 2
    dnes 13:44 | Zajímavý projekt

    Vývojáři se podařilo vytvořit patch pro Wine, díky kterému je možné na linuxovém stroji nainstalovat a spustit Adobe Photoshop (testováno s verzemi Photoshopu PS2021 a PS2025). Dalším patchem se podařilo umožnit dokonce instalaci téměř celého Adobe Creative Cloud Collection 2023, vyjma aplikací Adobe XD a Adobe Fresco. Patch řeší kompatibilitu s windowsovými subsystémy MSHTML - jádrem prohlížeče Internet exporer, a MSXML3 - parserem

    … více »
    NUKE GAZA! 🎆 | Komentářů: 0
    dnes 13:33 | IT novinky

    Hackeři zaútočili na portál veřejných zakázek a vyřadili ho z provozu. Systém, ve kterém musí být ze zákona sdíleny informace o veřejných zakázkách, se ministerstvo pro místní rozvoj (MMR) nyní pokouší co nejdříve zprovoznit. Úřad o tom informoval na svém webu a na sociálních sítích. Portál slouží pro sdílení informací mezi zadavateli a dodavateli veřejných zakázek.

    Ladislav Hagara | Komentářů: 2
    dnes 12:22 | Nová verze

    Javascriptová knihovna jQuery (Wikipedie) oslavila 20. narozeniny, John Resig ji představil v lednu 2006 na newyorském BarCampu. Při této příležitosti byla vydána nová major verze 4.0.0.

    Ladislav Hagara | Komentářů: 1
    dnes 01:33 | Zajímavý projekt

    Singularity je rootkit ve formě jaderného modulu (Linux Kernel Module), s otevřeným zdrojovým kódem dostupným pod licencí MIT. Tento rootkit je určený pro moderní linuxová jádra 6.x a poskytuje své 'komplexní skryté funkce' prostřednictvím hookingu systémových volání pomocí ftrace. Pro nadšence je k dispozici podrobnější popis rootkitu na blogu autora, případně v článku na LWN.net. Projekt je zamýšlen jako pomůcka pro bezpečnostní experty a výzkumníky, takže instalujte pouze na vlastní nebezpečí a raději pouze do vlastních strojů 😉.

    NUKE GAZA! 🎆 | Komentářů: 0
    včera 21:22 | Zajímavý projekt

    Iconify je seznam a galerie kolekcí vektorových open-source ikon, ke stažení je přes 275000 ikon z více jak dvou set sad. Tento rovněž open-source projekt dává vývojářům k dispozici i API pro snadnou integraci svobodných ikon do jejich projektů.

    NUKE GAZA! 🎆 | Komentářů: 3
    včera 03:33 | IT novinky

    Dle plánu certifikační autorita Let's Encrypt nově vydává také certifikáty s šestidenní platností (160 hodin) s možností vystavit je na IP adresu.

    Ladislav Hagara | Komentářů: 8
    17.1. 14:44 | Nová verze

    V programovacím jazyce Go naprogramovaná webová aplikace pro spolupráci na zdrojových kódech pomocí gitu Forgejo byla vydána ve verzi 14.0 (Mastodon). Forgejo je fork Gitei.

    Ladislav Hagara | Komentářů: 7
    17.1. 13:11 | Zajímavý projekt

    Just the Browser je projekt, 'který vám pomůže v internetovém prohlížeči deaktivovat funkce umělé inteligence, telemetrii, sponzorovaný obsah, integraci produktů a další nepříjemnosti' (repozitář na GitHubu). Využívá k tomu skrytá nastavení ve webových prohlížečích, určená původně pro firmy a organizace ('enterprise policies'). Pod linuxem je skriptem pro automatickou úpravu nastavení prozatím podporován pouze prohlížeč Firefox.

    NUKE GAZA! 🎆 | Komentářů: 3
    16.1. 16:44 | Nová verze

    Svobodný multiplatformní herní engine Bevy napsaný v Rustu byl vydán ve verzi 0.18. Díky 174 přispěvatelům.

    Ladislav Hagara | Komentářů: 2
    Které desktopové prostředí na Linuxu používáte?
     (18%)
     (5%)
     (0%)
     (9%)
     (20%)
     (3%)
     (5%)
     (2%)
     (11%)
     (39%)
    Celkem 519 hlasů
     Komentářů: 14, poslední včera 10:22
    Rozcestník

    Pyqt4 a použití modulu uic.

    6.6.2011 20:51 | Přečteno: 1346× | 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.