SlideShare une entreprise Scribd logo
1  sur  22
Télécharger pour lire hors ligne
Mágica com Qt's meta-object system
Rodrigo Delduca (@skhaz)
http://nullonerror.org
http://ultratech.software
C/C++
Brasil 2015
// FooBar.h
class FooBar : public QObject {
Q_OBJECT
public:
FooBar(QObject *parent = 0);
}
// FooBar.cpp
#include "FooBar.h"
FooBar::FooBar(QObject *parent)
: QObject(parent) {
}
// FooBar.h
class FooBar : public QObject {
Q_OBJECT
public:
FooBar(QObject *parent = 0);
}
QList, QString, QMap... Onde está
minha querida STL? Senta que lá
vem história...
Qt (/ˈkjuːt/ "cute"): do inglês,
"fofinho"
QList, QString, QMap... Onde está
minha querida STL? Senta que lá
vem história...
Primeira versão em 20/05/1995 (quase 20 anos
atrás!)
"The toolkit was called Qt because the letter Q
looked appealing in Haavard's Emacs typeface,
and "t" was inspired by Xt, the X toolkit" -
Wikipedia
TODAS as classes iniciam com a letra Q (~ 1200)
QList, QString, QMap... Onde está
minha querida STL? Senta que lá
vem história...
Na época os compiladores não suportavam
e/ou não existiam recursos avancados, como
metaprograming, templates, variadic template,
lambda, stl, libsigc++, boost...
Não existia nada como boost.signals2
QList, QString, QMap... Onde está
minha querida STL? Senta que lá
vem história...
Na época os compiladores não suportavam
e/ou não existiam recursos avancados, como
metaprograming, templates, variadic template,
lambda, stl, libsigc++, boost...
Não existia nada como boost.signals2
A solução foi criar o MOC
MOC (Meta-Object Compiler)
Percorre por todos os headers do
projeto e ao encontrar a macro Q_OBJECT,
gera um novo arquivo com o prefixo moc_*.
cpp
Suportado por diversas ferramentas de build e
IDE como cmake, scons, waf, etc
Can Qt's moc be replaced by C++ reflection?
MOC (Meta-Object Compiler)
E é C++ padrão
Macro definido em
src/corelib/kernel/qobjectdefs.h
Informa ao MOC (Meta Object Compiler) que
que se trata de um Meta Object, gerando
código extra (moc_*.cpp)
Obriga que a classe herde de QObject. Toda
classe que herde QObject possui os métodos
metaObject & staticMetaObject
Q_OBJECT? De onde vem? O que
come? Onde vive?
clang++ -E FooBar.h...
class FooBar : public QObject {
public: template <typename ThisObject> inline void
qt_check_for_QOBJECT_macro(const ThisObject &_q_argument) const { int i =
qYouForgotTheQ_OBJECT_Macro(this, &_q_argument); i = i + 1; } static const
QMetaObject staticMetaObject; virtual const QMetaObject *metaObject()
const; virtual void *qt_metacast(const char *); static inline QString tr(const
char *s, const char *c = 0, int n = -1) { return staticMetaObject.tr(s, c, n); }
static inline QString trUtf8(const char *s, const char *c = 0, int n = -1) { return
staticMetaObject.tr(s, c, n); } virtual int qt_metacall(QMetaObject::Call, int, void
**); private: __attribute__((visibility("hidden"))) static void qt_static_metacall
(QObject *, QMetaObject::Call, int, void **); struct QPrivateSignal {};
public:
FooBar(QObject *parent = 0);
}
Q_GADGET, a versão diet do
Q_OBJECT
Definido em src/corelib/kernel/qobjectdefs.h
Não obriga que a classe herde de QObject
"Enxerta" bem menos código
Tem alguns super poderes (exceto os
herdados pelo QObject, como por ex. sinais e
slots)
Os incríveis super poderes do
QMetaObject
● Nome da classe className
● Informações sobre a classe pai QMetaObject*
superClass()
● Informações sobre os construtores int
constructorCount() & QMetaMethod constructor(int
index)
● Informações sobre os enumeradores QMetaEnum
enumerator(int index) const, int enumeratorCount() &
int indexOfEnumerator(const char * name)
● Informações sobre os métodos, sinais e slots int
methodCount() & QMetaMethod method(int index)
Os incríveis super poderes do
QMetaObject
● Informações sobre as propriedades int
propertyCount() & QMetaProperty property(int index)
● Informações gerais da classe int classInfoCount() &
QMetaClassInfo classInfo(int index)
class FooBar {
Q_OBJECT
Q_CLASSINFO("author", "Rodrigo Delduca")
Q_CLASSINFO("url", "http://nullonerror.org")
}
Os incríveis super poderes do
QMetaObject
● Criar uma nova instância QObject* newInstance(args
...)
qobject_cast<MinhaClasse*>(meta->newInstance());
NOTA: O construtor de MinhaClasse precisa ser
declarado como Q_INVOKABLE
● Invocar métodos pelos seus nomes invokeMethod
QMetaObject::invokeMethod(thread, "quit", Qt::
QueuedConnection);
● ...Entre outras coisas :)
Os incríveis super poderes do
QMetaObject
● Criar uma nova instância QObject* newInstance(args
...)
qobject_cast<MeuObject*>(meta->newInstance());
NOTA: O construtor de MeuObject precisa ser
declarado como Q_INVOKABLE
● Invocar métodos pelos seus nomes invokeMethod
QMetaObject::invokeMethod(thread, "quit", Qt::
QueuedConnection);
● ...Entre outras coisas :)
Utilidades
● ORM (ex. Qdjango)
● Serialização (ex. QJson QObjectHelper::
qobject2qvariant)
● RPC
● Magia negra...
Aplicações híbridas
Demo
C++ -> QML
C++
qmlRegisterType<MinhaClasse>("MeuPacote", 1, 0,
"MinhaClasse");
QML
import MeuPacote 1.0
MinhaClasse {
onSignal01: {
// do something
}
words: ['foo', 'bar', 'xpto']
}
QML -> C++
QML
Button {
signal clicked()
objectName: button
}
C++
QObject *button = root->findChild<QObject *>("button");
if (button)
QObject::connect(button, SIGNAL(clicked()),
this, SLOT(onClicked(QString)));
Scorpion wins
Flawless victory
Fatality!
Muito obrigado :)

Contenu connexe

Tendances

Python para quem sabe Python (aula 2)
Python para quem sabe Python (aula 2)Python para quem sabe Python (aula 2)
Python para quem sabe Python (aula 2)
Luciano Ramalho
 
(A15) LabMM3 - JavaScript - Objectos: String, Date e Math
(A15) LabMM3 - JavaScript - Objectos: String, Date e Math(A15) LabMM3 - JavaScript - Objectos: String, Date e Math
(A15) LabMM3 - JavaScript - Objectos: String, Date e Math
Carlos Santos
 
Objective-C e o dinamismo da linguagem
Objective-C e o dinamismo da linguagemObjective-C e o dinamismo da linguagem
Objective-C e o dinamismo da linguagem
Diego Chohfi
 
Java - Introdução a Coleções e Generics
Java - Introdução a Coleções e GenericsJava - Introdução a Coleções e Generics
Java - Introdução a Coleções e Generics
Sérgio Souza Costa
 
Curso de introdução ao ruby
Curso de introdução ao rubyCurso de introdução ao ruby
Curso de introdução ao ruby
Francis Wagner
 

Tendances (20)

Curso de OO com C# - Parte 06 - ADO.NET
Curso de OO com C# - Parte 06 - ADO.NETCurso de OO com C# - Parte 06 - ADO.NET
Curso de OO com C# - Parte 06 - ADO.NET
 
Python para quem sabe Python (aula 2)
Python para quem sabe Python (aula 2)Python para quem sabe Python (aula 2)
Python para quem sabe Python (aula 2)
 
Introdução à programação em Android e iOS - OOP em ObjC
Introdução à programação em Android e iOS - OOP em ObjCIntrodução à programação em Android e iOS - OOP em ObjC
Introdução à programação em Android e iOS - OOP em ObjC
 
Pyro vs RMI
Pyro vs RMIPyro vs RMI
Pyro vs RMI
 
Objetos Pythonicos - compacto
Objetos Pythonicos - compactoObjetos Pythonicos - compacto
Objetos Pythonicos - compacto
 
(A15) LabMM3 - JavaScript - Objectos: String, Date e Math
(A15) LabMM3 - JavaScript - Objectos: String, Date e Math(A15) LabMM3 - JavaScript - Objectos: String, Date e Math
(A15) LabMM3 - JavaScript - Objectos: String, Date e Math
 
Threads 03: Ciclo de vida, aplicações e boas práticas
Threads 03: Ciclo de vida, aplicações e boas práticasThreads 03: Ciclo de vida, aplicações e boas práticas
Threads 03: Ciclo de vida, aplicações e boas práticas
 
Orientação a Objetos em Python
Orientação a Objetos em PythonOrientação a Objetos em Python
Orientação a Objetos em Python
 
Curso de OO com C# - Parte 04 - Estruturas de controle e Strings
Curso de OO com C# - Parte 04 - Estruturas de controle e StringsCurso de OO com C# - Parte 04 - Estruturas de controle e Strings
Curso de OO com C# - Parte 04 - Estruturas de controle e Strings
 
Orientação a objetos em Python (compacto)
Orientação a objetos em Python (compacto)Orientação a objetos em Python (compacto)
Orientação a objetos em Python (compacto)
 
Aprendendo objective c - parte 1
Aprendendo objective c - parte 1Aprendendo objective c - parte 1
Aprendendo objective c - parte 1
 
Revisão OCPJP7 - String Processing
Revisão OCPJP7 - String ProcessingRevisão OCPJP7 - String Processing
Revisão OCPJP7 - String Processing
 
Objective-C e o dinamismo da linguagem
Objective-C e o dinamismo da linguagemObjective-C e o dinamismo da linguagem
Objective-C e o dinamismo da linguagem
 
Threads 09: Paralelismo
Threads 09: ParalelismoThreads 09: Paralelismo
Threads 09: Paralelismo
 
Threads 10: CompletableFuture
Threads 10: CompletableFutureThreads 10: CompletableFuture
Threads 10: CompletableFuture
 
Ruby - Criando código para máquinas e humanos
Ruby - Criando código para máquinas e humanosRuby - Criando código para máquinas e humanos
Ruby - Criando código para máquinas e humanos
 
Grails - Destaques (para quem já sabe Java)
Grails - Destaques (para quem já sabe Java)Grails - Destaques (para quem já sabe Java)
Grails - Destaques (para quem já sabe Java)
 
Java - Introdução a Coleções e Generics
Java - Introdução a Coleções e GenericsJava - Introdução a Coleções e Generics
Java - Introdução a Coleções e Generics
 
Curso de introdução ao ruby
Curso de introdução ao rubyCurso de introdução ao ruby
Curso de introdução ao ruby
 
Threads 05: Travas de Exclusão Mútua
Threads 05: Travas de Exclusão MútuaThreads 05: Travas de Exclusão Mútua
Threads 05: Travas de Exclusão Mútua
 

En vedette

Trabalhando com aplicações qt no net beans
Trabalhando com aplicações qt no net beansTrabalhando com aplicações qt no net beans
Trabalhando com aplicações qt no net beans
Valdomiro Morais
 
QTestLib: Criando unit tests inteligentes para projetos baseados em Qt
QTestLib: Criando unit tests inteligentes para projetos baseados em QtQTestLib: Criando unit tests inteligentes para projetos baseados em Qt
QTestLib: Criando unit tests inteligentes para projetos baseados em Qt
Bruno Abinader
 
Desenvolvimento orientado a objetos com C++ e QT4 - Henrique Marks
Desenvolvimento orientado a objetos com C++ e QT4 - Henrique MarksDesenvolvimento orientado a objetos com C++ e QT4 - Henrique Marks
Desenvolvimento orientado a objetos com C++ e QT4 - Henrique Marks
Tchelinux
 

En vedette (20)

Jogos em Qt
Jogos em QtJogos em Qt
Jogos em Qt
 
TDC Goiânia, WP7 e Qt
TDC Goiânia, WP7 e QtTDC Goiânia, WP7 e Qt
TDC Goiânia, WP7 e Qt
 
Utilizando o recurso de camera dos smartphones da Nokia usando qt
Utilizando o recurso de camera dos smartphones da Nokia usando qtUtilizando o recurso de camera dos smartphones da Nokia usando qt
Utilizando o recurso de camera dos smartphones da Nokia usando qt
 
Opengl aula-01
Opengl aula-01Opengl aula-01
Opengl aula-01
 
Introdução ao Qt
Introdução ao QtIntrodução ao Qt
Introdução ao Qt
 
Trabalhando com aplicações qt no net beans
Trabalhando com aplicações qt no net beansTrabalhando com aplicações qt no net beans
Trabalhando com aplicações qt no net beans
 
QtQuick - WSL II
QtQuick - WSL IIQtQuick - WSL II
QtQuick - WSL II
 
QTestLib: Criando unit tests inteligentes para projetos baseados em Qt
QTestLib: Criando unit tests inteligentes para projetos baseados em QtQTestLib: Criando unit tests inteligentes para projetos baseados em Qt
QTestLib: Criando unit tests inteligentes para projetos baseados em Qt
 
Rqt2
Rqt2Rqt2
Rqt2
 
Revista qt 4
Revista qt 4Revista qt 4
Revista qt 4
 
Tutorial api qt
Tutorial api qtTutorial api qt
Tutorial api qt
 
Qt tchelinux-2010
Qt tchelinux-2010Qt tchelinux-2010
Qt tchelinux-2010
 
QtQuick
QtQuickQtQuick
QtQuick
 
Introdução ao QML
Introdução ao QMLIntrodução ao QML
Introdução ao QML
 
Dicas de otimização para aplicações Qt
Dicas de otimização para aplicações QtDicas de otimização para aplicações Qt
Dicas de otimização para aplicações Qt
 
Qt Techday - João Pessoa
Qt Techday - João PessoaQt Techday - João Pessoa
Qt Techday - João Pessoa
 
Big data, e eu com isso?
Big data, e eu com isso?Big data, e eu com isso?
Big data, e eu com isso?
 
Algoritmo de Smith-Waterman
Algoritmo de Smith-WatermanAlgoritmo de Smith-Waterman
Algoritmo de Smith-Waterman
 
Desenvolvimento orientado a objetos com C++ e QT4 - Henrique Marks
Desenvolvimento orientado a objetos com C++ e QT4 - Henrique MarksDesenvolvimento orientado a objetos com C++ e QT4 - Henrique Marks
Desenvolvimento orientado a objetos com C++ e QT4 - Henrique Marks
 
PySide
PySidePySide
PySide
 

Similaire à Mágica com qt’s meta object system

As Novidades Do C# 4.0 - NetPonto
As Novidades Do C# 4.0 - NetPontoAs Novidades Do C# 4.0 - NetPonto
As Novidades Do C# 4.0 - NetPonto
Paulo Morgado
 
[CLPE] Design patterns com c#
[CLPE] Design patterns com c#[CLPE] Design patterns com c#
[CLPE] Design patterns com c#
Felipe Pimentel
 
Javascript para CSharpers 4 - POO
Javascript para CSharpers 4 - POOJavascript para CSharpers 4 - POO
Javascript para CSharpers 4 - POO
Wesley Lemos
 
Linguagens Poo
Linguagens PooLinguagens Poo
Linguagens Poo
Infogenius
 

Similaire à Mágica com qt’s meta object system (20)

Mock Objects
Mock ObjectsMock Objects
Mock Objects
 
As Novidades Do C# 4.0 - NetPonto
As Novidades Do C# 4.0 - NetPontoAs Novidades Do C# 4.0 - NetPonto
As Novidades Do C# 4.0 - NetPonto
 
Maratona de Programação com STL
Maratona de Programação com STLMaratona de Programação com STL
Maratona de Programação com STL
 
Como criar classes e objetos
Como criar classes e objetosComo criar classes e objetos
Como criar classes e objetos
 
Como criar classes e objetos
Como criar classes e objetosComo criar classes e objetos
Como criar classes e objetos
 
Passagem de Objetos entre Java e Oracle
Passagem de Objetos entre Java e OraclePassagem de Objetos entre Java e Oracle
Passagem de Objetos entre Java e Oracle
 
OOP ObjC
OOP ObjCOOP ObjC
OOP ObjC
 
Gerando bindings de bibliotecas C++ para Python
Gerando bindings de bibliotecas C++ para PythonGerando bindings de bibliotecas C++ para Python
Gerando bindings de bibliotecas C++ para Python
 
Python: Cabe no seu bolso, no seu micro, no seu cérebro.
Python: Cabe no seu bolso, no seu micro, no seu cérebro.Python: Cabe no seu bolso, no seu micro, no seu cérebro.
Python: Cabe no seu bolso, no seu micro, no seu cérebro.
 
[CLPE] Design patterns com c#
[CLPE] Design patterns com c#[CLPE] Design patterns com c#
[CLPE] Design patterns com c#
 
Javascript para CSharpers 4 - POO
Javascript para CSharpers 4 - POOJavascript para CSharpers 4 - POO
Javascript para CSharpers 4 - POO
 
Algoritmos de ordenação
Algoritmos de ordenaçãoAlgoritmos de ordenação
Algoritmos de ordenação
 
Introducao Google GO
Introducao Google GOIntroducao Google GO
Introducao Google GO
 
Turbinando o desenvolvimento Android com Kotlin
Turbinando o desenvolvimento Android com KotlinTurbinando o desenvolvimento Android com Kotlin
Turbinando o desenvolvimento Android com Kotlin
 
Java 06
Java 06Java 06
Java 06
 
05 poo-ii
05   poo-ii05   poo-ii
05 poo-ii
 
Threads e Estruturas de dados
Threads e Estruturas de dadosThreads e Estruturas de dados
Threads e Estruturas de dados
 
Threads 07: Sincronizadores
Threads 07: SincronizadoresThreads 07: Sincronizadores
Threads 07: Sincronizadores
 
Linguagens Poo
Linguagens PooLinguagens Poo
Linguagens Poo
 
Grafos e Algoritimos - Dr. Julio Cesar de Araujo Menezes
Grafos e Algoritimos - Dr. Julio Cesar de Araujo MenezesGrafos e Algoritimos - Dr. Julio Cesar de Araujo Menezes
Grafos e Algoritimos - Dr. Julio Cesar de Araujo Menezes
 

Mágica com qt’s meta object system

  • 1. Mágica com Qt's meta-object system Rodrigo Delduca (@skhaz) http://nullonerror.org http://ultratech.software C/C++ Brasil 2015
  • 2. // FooBar.h class FooBar : public QObject { Q_OBJECT public: FooBar(QObject *parent = 0); } // FooBar.cpp #include "FooBar.h" FooBar::FooBar(QObject *parent) : QObject(parent) { }
  • 3. // FooBar.h class FooBar : public QObject { Q_OBJECT public: FooBar(QObject *parent = 0); }
  • 4. QList, QString, QMap... Onde está minha querida STL? Senta que lá vem história... Qt (/ˈkjuːt/ "cute"): do inglês, "fofinho"
  • 5. QList, QString, QMap... Onde está minha querida STL? Senta que lá vem história... Primeira versão em 20/05/1995 (quase 20 anos atrás!) "The toolkit was called Qt because the letter Q looked appealing in Haavard's Emacs typeface, and "t" was inspired by Xt, the X toolkit" - Wikipedia TODAS as classes iniciam com a letra Q (~ 1200)
  • 6. QList, QString, QMap... Onde está minha querida STL? Senta que lá vem história... Na época os compiladores não suportavam e/ou não existiam recursos avancados, como metaprograming, templates, variadic template, lambda, stl, libsigc++, boost... Não existia nada como boost.signals2
  • 7. QList, QString, QMap... Onde está minha querida STL? Senta que lá vem história... Na época os compiladores não suportavam e/ou não existiam recursos avancados, como metaprograming, templates, variadic template, lambda, stl, libsigc++, boost... Não existia nada como boost.signals2 A solução foi criar o MOC
  • 8. MOC (Meta-Object Compiler) Percorre por todos os headers do projeto e ao encontrar a macro Q_OBJECT, gera um novo arquivo com o prefixo moc_*. cpp Suportado por diversas ferramentas de build e IDE como cmake, scons, waf, etc Can Qt's moc be replaced by C++ reflection?
  • 10. Macro definido em src/corelib/kernel/qobjectdefs.h Informa ao MOC (Meta Object Compiler) que que se trata de um Meta Object, gerando código extra (moc_*.cpp) Obriga que a classe herde de QObject. Toda classe que herde QObject possui os métodos metaObject & staticMetaObject Q_OBJECT? De onde vem? O que come? Onde vive?
  • 11. clang++ -E FooBar.h... class FooBar : public QObject { public: template <typename ThisObject> inline void qt_check_for_QOBJECT_macro(const ThisObject &_q_argument) const { int i = qYouForgotTheQ_OBJECT_Macro(this, &_q_argument); i = i + 1; } static const QMetaObject staticMetaObject; virtual const QMetaObject *metaObject() const; virtual void *qt_metacast(const char *); static inline QString tr(const char *s, const char *c = 0, int n = -1) { return staticMetaObject.tr(s, c, n); } static inline QString trUtf8(const char *s, const char *c = 0, int n = -1) { return staticMetaObject.tr(s, c, n); } virtual int qt_metacall(QMetaObject::Call, int, void **); private: __attribute__((visibility("hidden"))) static void qt_static_metacall (QObject *, QMetaObject::Call, int, void **); struct QPrivateSignal {}; public: FooBar(QObject *parent = 0); }
  • 12. Q_GADGET, a versão diet do Q_OBJECT Definido em src/corelib/kernel/qobjectdefs.h Não obriga que a classe herde de QObject "Enxerta" bem menos código Tem alguns super poderes (exceto os herdados pelo QObject, como por ex. sinais e slots)
  • 13. Os incríveis super poderes do QMetaObject ● Nome da classe className ● Informações sobre a classe pai QMetaObject* superClass() ● Informações sobre os construtores int constructorCount() & QMetaMethod constructor(int index) ● Informações sobre os enumeradores QMetaEnum enumerator(int index) const, int enumeratorCount() & int indexOfEnumerator(const char * name) ● Informações sobre os métodos, sinais e slots int methodCount() & QMetaMethod method(int index)
  • 14. Os incríveis super poderes do QMetaObject ● Informações sobre as propriedades int propertyCount() & QMetaProperty property(int index) ● Informações gerais da classe int classInfoCount() & QMetaClassInfo classInfo(int index) class FooBar { Q_OBJECT Q_CLASSINFO("author", "Rodrigo Delduca") Q_CLASSINFO("url", "http://nullonerror.org") }
  • 15. Os incríveis super poderes do QMetaObject ● Criar uma nova instância QObject* newInstance(args ...) qobject_cast<MinhaClasse*>(meta->newInstance()); NOTA: O construtor de MinhaClasse precisa ser declarado como Q_INVOKABLE ● Invocar métodos pelos seus nomes invokeMethod QMetaObject::invokeMethod(thread, "quit", Qt:: QueuedConnection); ● ...Entre outras coisas :)
  • 16. Os incríveis super poderes do QMetaObject ● Criar uma nova instância QObject* newInstance(args ...) qobject_cast<MeuObject*>(meta->newInstance()); NOTA: O construtor de MeuObject precisa ser declarado como Q_INVOKABLE ● Invocar métodos pelos seus nomes invokeMethod QMetaObject::invokeMethod(thread, "quit", Qt:: QueuedConnection); ● ...Entre outras coisas :)
  • 17. Utilidades ● ORM (ex. Qdjango) ● Serialização (ex. QJson QObjectHelper:: qobject2qvariant) ● RPC ● Magia negra...
  • 19. Demo
  • 20. C++ -> QML C++ qmlRegisterType<MinhaClasse>("MeuPacote", 1, 0, "MinhaClasse"); QML import MeuPacote 1.0 MinhaClasse { onSignal01: { // do something } words: ['foo', 'bar', 'xpto'] }
  • 21. QML -> C++ QML Button { signal clicked() objectName: button } C++ QObject *button = root->findChild<QObject *>("button"); if (button) QObject::connect(button, SIGNAL(clicked()), this, SLOT(onClicked(QString)));