Typové informace

C++ jako klasický kompilovaný jazyk za běhu programu neumožňuje zjistit jaké jsou metody nějakého objektu.
Některé knihovny jako Qt nebo OpenInventor případně další programovací jazyky jako Java nebo C# spolu s objekty do programu začleňují typové informace umožňující zjistit seznam metod daného objektu a případně metody zavolat.

Typové informace se využívají v programech pro grafický návrh oken.
Například je využívá Delphi, NetBeans, SharpDevelop a nejspíše také Visual Studio.
Typově informace používají skriptovací jazyky pro začlenění objektů, např. Python.

Následující program zobrazí typové informace získané z jednoho objektu, v našem případě z hlavního okna.

Zobrazíme vlastnosti (properties), to jsou jazykové konstrukce které z pohledu programátora vypadají jako proměnné a jsou obvykle tvořeny dvojicí funkcí pro čtení a změnu hodnoty.

        typ = data.metaObject ()
        cnt = typ.propertyCount ()
        for inx in range (cnt) :
            prop = typ.property (inx)
            value = str (prop.read (data))
            txt = prop.name () + " : " + prop.typeName () + " = " + value

Proměnná data představuje zkoumaný objekt.
V proměnné typ budou typové informace o objektu.
V cyklu projdeme seznam vlastností a popis jednotlivé vlastnosti bude v proměnné prop.
O vlastnoti se můžeme dozvědět její jméno a typ, zde v textové podobě.
Pro získání hodnoty dané vlastnosti musíme ještě zadat konkrétní objekt, jehož vlastnost chceme přečíst.

    prop.read (data)

Zde je celý program:

import sys
 
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
 
def bytes_to_str (b) :
    return str (b, "ascii", errors="ignore")
 
class StructWin (QTreeWidget):
 
    def __init__ (self, parent=None) :
        super (StructWin, self).__init__ (parent)
 
    def display (self, name, data) :
        node = QTreeWidgetItem ()
        node.setText (0, name)
        node.setForeground (0, QColor ("orange"))
        self.addTopLevelItem (node)
 
        self.displayProperties (node, data)
        self.displaySignals (node, data)
        self.displaySlots (node, data)
        self.displayMethods (node, data)
 
        node.setExpanded (True)
 
    def displayProperties (self, target, data) :
        branch = QTreeWidgetItem ()
        branch.setText (0, "properties")
        branch.setForeground (0, QColor (0, 0, 255))
        target.addChild (branch)
 
        typ = data.metaObject ()
        cnt = typ.propertyCount ()
        for inx in range (cnt) :
            prop = typ.property (inx)
            value = str (prop.read (data))
            txt = prop.name () + " : " + prop.typeName () + " = " + value
            node = QTreeWidgetItem ()
            node.setText (0, txt)
            node.setForeground (0, QColor (0, 0, 255))
            branch.addChild (node)
 
    def displaySignals (self, target, data) :
        branch = QTreeWidgetItem ()
        branch.setText (0, "signals")
        branch.setForeground (0, QColor (0, 255, 0))
        target.addChild (branch)
 
        typ = data.metaObject ()
        cnt = typ.methodCount ()
        for inx in range (cnt) :
            method = typ.method (inx)
            if method.methodType () == QMetaMethod.Signal :
               node = QTreeWidgetItem ()
               node.setText (0, bytes_to_str (method.methodSignature ()))
               node.setForeground (0, QColor (0, 255, 0))
               branch.addChild (node)
 
    def displaySlots (self, target, data) :
        branch = QTreeWidgetItem ()
        branch.setText (0, "slots")
        branch.setForeground (0, QColor (0, 255, 0))
        target.addChild (branch)
 
        typ = data.metaObject ()
        cnt = typ.methodCount ()
        for inx in range (cnt) :
            method = typ.method (inx)
            if method.methodType () == QMetaMethod.Slot :
               node = QTreeWidgetItem ()
               node.setText (0, bytes_to_str (method.methodSignature ()))
               node.setForeground (0, QColor (0, 255, 0))
               branch.addChild (node)
 
    def displayMethods (self, target, data) :
        branch = QTreeWidgetItem ()
        branch.setText (0, "methods")
        branch.setForeground (0, QColor (255, 0, 0))
        target.addChild (branch)
 
        typ = data.metaObject ()
        cnt = typ.methodCount ()
        for inx in range (cnt) :
            method = typ.method (inx)
            if method.methodType () != QMetaMethod.Method :
               node = QTreeWidgetItem ()
               node.setText (0, bytes_to_str (method.methodSignature ()))
               node.setForeground (0, QColor (255, 0, 0))
               branch.addChild (node)
 
if __name__ == '__main__' :
   app = QApplication (sys.argv)
   win = StructWin ()
   win.show ()
   win.display ("window", win)
   app.exec_ ()

 
uop/qt_py_typeinfo.txt · Last modified: 2023/12/11 17:26 by 86.49.241.78
 
Recent changes RSS feed Creative Commons License Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki