Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. International
  3. Portuguese
  4. Como Manipular uma Classe Qualquer?
Forum Updated to NodeBB v4.3 + New Features

Como Manipular uma Classe Qualquer?

Scheduled Pinned Locked Moved Portuguese
12 Posts 3 Posters 5.5k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • R Offline
    R Offline
    Rodrigocg
    wrote on last edited by
    #3

    Eu pretendo fazer uma classe que faça o INSERT, DELETE e o SELECT de um objeto qualquer...

    1 Reply Last reply
    0
    • M Offline
      M Offline
      micdoug
      wrote on last edited by
      #4

      Cara, também estou procurando uma alternativa que faça exatamente o que você quer. Uma classe especializada em mapear objetos de c++ para entidades do banco de dados de forma que execute todas as operações de gerenciamento (criar, deletar, editar, consultar) automaticamente, o que também é conhecido como padrão de projeto DAO (data access object). Pesquisei bastante na internet e descobri sobre alguns projetos para C++ que prometem fazer isso, o que mais me interessou foi o "QxOrm":http://www.qxorm.com/qxorm_en/home.html (construído usando Qt) mas ainda não tive tempo de estudar esta ferramenta.

      Outra alternativa é você tentar implementar o padrão DAO, o que é o que estou fazendo atualmente. Criei uma classe base chamada DAO que contém um QSqlDatabase (referência de acesso ao banco), QSqlQuery (para executar comandos). A partir desta classe eu derivo outras que são especializadas em fazer as operações de banco para determinada classe, como por exemplo CidadeDAO, que implementa os métodos criar, deletar, editar e encontrar. Porém esta abordagem está se mostrando altamente improdutiva, pois é preciso se codificar muito (comandos sql). Estou pensando bastante em estudar o qxorm, o que ainda me faz continuar usando a segunda abordagem está no fato de o desempenho e customização serem facilmente manipuláveis.

      1 Reply Last reply
      0
      • R Offline
        R Offline
        Rodrigocg
        wrote on last edited by
        #5

        Eu consegui alguma coisa aqui... Quando eu faço um metodo assim:

        @bool inserir(QObject meuObjeto)@

        depois so usar os signals e Slots para trocar mensagens com os objetos...

        eu estava comendo barriga aqui com isso, dai lembrei que fiz algo parecido, mas foi para fazer buscas..

        vou fazer um exemplo aqui e te falo o resultado...

        1 Reply Last reply
        0
        • T Offline
          T Offline
          TioRoy
          wrote on last edited by
          #6

          Você quer serializar o QObject para gravar num BLOB por exemplo?

          Usamos aqui uma abordagem de serializar o objeto semelhante ao "protobuf":https://code.google.com/p/protobuf/) ou o "boost::serialization":http://www.boost.org/doc/libs/1_53_0/libs/serialization/doc/index.html) mas do nosso jeito aqui (por questões de dependências e performance).

          1 Reply Last reply
          0
          • R Offline
            R Offline
            Rodrigocg
            wrote on last edited by
            #7

            Desculpe, nao entendi o que você quis dizer... se possivel de um exemplo...

            1 Reply Last reply
            0
            • T Offline
              T Offline
              TioRoy
              wrote on last edited by
              #8

              Quando vc disse

              bq. @bool inserir(QObject meuObjeto)@

              me lembrei que usamos aqui um mecanismo para serializar o objeto: transformar a classe em um vetor de bytes. Aí usamos para transmitir (via socket). No seu caso, você poderia armazenar o objeto no banco de dados, numa coluna BLOB. Algo +- assim:

              @
              class Message : public Serializable
              {
              public:
              virtual ~Message( void ) { }
              inline Header & getHeader( void ) { return header; }
              virtual bool Read( Reader & br );
              virtual void Write(Writer & bw );

              private:
              Header header;
              };
              @

              cada classe implementa os Read e Write escrevendo a sua estrutura. Mas aqui não usamos o Qt (estou tentando convencer a galera aqui :-) )

              Acho que talvez, o QMetaObject forneça o que você quer fazer, +- assim:

              @
              class C1 : public QObject
              {
              Q_OBJECT
              private:

              public:
              explicit C1(QObject *parent = 0);

              QString campo1() const; //Tem que existir o método de leitura
              
              Q_PROPERTY(QString campo1 READ campo1)    //Aqui vc declara a propriedade
              

              };
              @

              E depois vc pode enumerar as propriedades:

              @
              int main(int argc, char *argv[])
              {
              C1 *c1 = new C1();

              const QMetaObject* metaObject = c1->metaObject();
              
              for(int i = metaObject->propertyOffset(); i < metaObject->propertyCount(); ++i)
                  qDebug() << QString::fromLatin1(metaObject->property(i).name());
              

              }
              @

              Vc poderia listar as propriedades, e mapear as propriedades para cada campo em uma tabela.

              Dê uma olhada "aqui":http://qt-project.org/doc/qt-4.8/properties.html e "aqui":http://qt-project.org/doc/qt-4.8/qmetaobject.html

              1 Reply Last reply
              0
              • R Offline
                R Offline
                Rodrigocg
                wrote on last edited by
                #9

                Esou implementando algo aqui para ver se entendo... Voce pode me dizer como que eu faço para identificar o tipo de dado?

                1 Reply Last reply
                0
                • T Offline
                  T Offline
                  TioRoy
                  wrote on last edited by
                  #10

                  Sabendo o nome das properties, vc pode acessar via

                  @QVariant v = obj->property("nome")@

                  onde o valor é "encapsulado" no "QVariant":http://qt-project.org/doc/qt-4.8/qvariant.html.

                  Você pode usar o type() ou typeName() do QVariant para saber o tipo.

                  1 Reply Last reply
                  0
                  • R Offline
                    R Offline
                    Rodrigocg
                    wrote on last edited by
                    #11

                    Se nao pedir muito, como faço para pegar o conteudo?

                    Ha, consegui por pra imprimir o tipo... To entendendo muito sobre o assunto... vou vazerum tuto ensinando o que eu aprendi... acredito que isso seja duvida de muida gente...

                    1 Reply Last reply
                    0
                    • R Offline
                      R Offline
                      Rodrigocg
                      wrote on last edited by
                      #12

                      Consegui!!!

                      header da classe c1:
                      @#ifndef C1_H
                      #define C1_H

                      #include <QObject>

                      class C1 : public QObject
                      {
                      Q_OBJECT
                      private:

                      public:
                      explicit C1(QObject *parent = 0);

                      QString campo1();//const; //Tem que existir o método de leitura
                      int campo2();
                      Q_PROPERTY(QString campo1 READ campo1)//Aqui vc declara a propriedade
                      Q_PROPERTY(int campo2 READ campo2)
                      

                      private:

                      };

                      #endif // C1_H
                      @

                      Meu cpp da classe c1
                      @#include "c1.h"

                      C1::C1(QObject *parent) :
                      QObject(parent)
                      {
                      }

                      QString C1::campo1()
                      {
                      return "Consegui";
                      }

                      int C1::campo2()
                      {
                      return 1;
                      }@

                      Meu main.c ficou assim:

                      @#include "mainwindow.h"
                      #include <QApplication>
                      #include <QDebug>
                      #include <QMetaProperty>
                      #include <QObject>
                      #include <QVariant>
                      #include <c1.h>

                      static void testeprint(QObject c1)
                      {
                      const QMetaObject
                      metaObject = c1->metaObject();

                      for(int i = metaObject->propertyOffset(); i &lt; metaObject-&gt;propertyCount(); ++i)
                      {
                          QVariant v = c1->property(metaObject->property(i).name());
                          qDebug() << QString::fromLatin1(metaObject->property(i).name())<<v.toString()<<v.type();
                      
                      }
                      

                      }
                      int main(int argc, char *argv[])
                      {
                      C1 *c1 = new C1;
                      testeprint(c1);
                      return 0;
                      }@

                      resultado do qDebug() :

                      "campo1" "Consegui" QVariant::QString
                      "campo2" "1" QVariant::int

                      ObrigadoTioRoy, suas dicas ajudaram muito!

                      1 Reply Last reply
                      0

                      • Login

                      • Login or register to search.
                      • First post
                        Last post
                      0
                      • Categories
                      • Recent
                      • Tags
                      • Popular
                      • Users
                      • Groups
                      • Search
                      • Get Qt Extensions
                      • Unsolved