====== 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}}