====== 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_ ()
{{reflection.png}}