Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. International
  3. Portuguese
  4. Signal, como saber qual objeto o enviou
QtWS25 Last Chance

Signal, como saber qual objeto o enviou

Scheduled Pinned Locked Moved Portuguese
15 Posts 3 Posters 6.2k Views
  • 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.
  • A Offline
    A Offline
    anselmolsm
    wrote on last edited by
    #4

    Olá

    [quote author="Waltton.scm" date="1325017968"]
    meu problema é com esse connect, compila tudo certo mas ocorre erro em tempo de execução…
    [/quote]

    Isso ocorre pois não é feita verificação de tipos dos argumentos de signals/slots em tempo de compilação. No processo de compilação, é feita a conversão pelo "moc (meta object compiler)":http://doc.qt.nokia.com/4.8-snapshot/moc.html#moc e são verificados se os argumentos do connect satisfazem a assinatura deste método. Aqui, por exemplo, aconteceria erro na compilação se você esquecesse das macros SIGNAL ou SLOT.

    Resumidamente, o que essa conversão feita pelo moc faz é gerar uma tabela para relacionar os signals de um objeto (sender/emissor) com os slots de outro (receiver/receptor). Esse erro na execução acontece pois aí é que aparecem os problemas dos argumentos dos signals/slots.

    Aliás, fazer essa verificação em tempo de compilação é uma das mudanças propostas para o no Qt5.

    [quote author="Waltton.scm" date="1325017968"]
    @
    this->connect(PButton_Abas[x],SIGNAL(clicked()),this,SLOT(AbreAba(x)));
    @
    [/quote]

    Aqui, deveria ser:

    @
    this->connect(PButton_Abas[x], SIGNAL(clicked()), this, SLOT(AbreAba(int)));
    @

    Note que ao informar ao connect os signals e slots envolvidos, você deve utilizar o tipo do argumento, não a variável x. Creio que houve engano apenas na hora de postar aqui, pois dessa forma o creio erro na execução seria outro ("no such slot").

    "Incompatible sender/receiver" aconteceu pois, como citado anteriormente, a resolução dos argumentos do slot ocorre quando da execução. Nesse caso, quando um sinal clicked() é emitido, sua aplicação tenta encontrar o slot AbreAba(int) e aí não sabe quem de onde tirar quem é esse argumento int.

    Daí você diz: "Mas e se eu quiser que o argumento int do meu método AbreAba tenha um valor padrão?"

    É possível sim. nesse caso a declaração do slot ficaria, por exemplo:
    @
    void AbreAba(int x=0);
    @

    E o connect:

    @
    this->connect(PButton_Abas[x], SIGNAL(clicked()), this, SLOT(AbreAba()));
    @

    Assim, não haveria erro de execução algum, mas seria inútil nesse seu cenário pois todo botão clicado geraria um AbreAba com valor 0. A título de curiosidade, se você observar na documentação, o "sinal clicked tem um argumento bool":http://doc.qt.nokia.com/4.8-snapshot/qabstractbutton.html#clicked, com valor default false.

    Vou separar as respostas em outros posts pra tentar dar uma organizada melhor :-)

    Anselmo L. S. Melo (anselmolsm)

    1 Reply Last reply
    0
    • A Offline
      A Offline
      anselmolsm
      wrote on last edited by
      #5

      O código do seu segundo post é uma solução possível, mas por que não herdar direto de QPushButton? :-)

      mybutton.h:
      @
      #ifndef MYBUTTON_H
      #define MYBUTTON_H

      #include <QPushButton>

      class MyButton : public QPushButton
      {
      Q_OBJECT
      public:
      explicit MyButton(QWidget *parent = 0);

      signals:
      void myClicked(QString);

      public slots:
      void callSignal();
      };

      #endif // MYBUTTON_H
      @

      mybutton.cpp:
      @

      #include "mybutton.h"

      MyButton::MyButton(QWidget *parent) :
      QPushButton(parent)
      {
      connect(this, SIGNAL(clicked()), SLOT(callSignal()));
      }

      void MyButton::callSignal() {
      emit myClicked(text());
      }
      @

      Anselmo L. S. Melo (anselmolsm)

      1 Reply Last reply
      0
      • A Offline
        A Offline
        anselmolsm
        wrote on last edited by
        #6

        Agora vamos à questão sobre a barra de rolagem.

        Apenas colocar botões dentro de um layout não fará aparecer uma barra de rolagem. Para isso, você precisa de uma "QScrollArea":http://developer.qt.nokia.com/doc/qt-4.8/qscrollarea.html.

        Segue um exemplo que poderia ser aplicado ao seu caso. Assuma que MyWidget é o widget que contém seus botões colocados no QHBoxLayout.

        @
        int main(int argc, char *argv[])
        {
        QApplication a(argc, argv);

        MyWidget w;
        QScrollArea sc;
        sc.setWidget(&w);
        
        QMainWindow mw;
        mw.setCentralWidget(&sc);
        mw.show();
        
        return a.exec&#40;&#41;;
        

        }
        @

        Agora, algumas perguntas/pensamentos:

        • O que você tem em mente com essa relação de botões e abas? Ficou a sensação de que está tentando fazer algo como o que "QTabWidget":http://developer.qt.nokia.com/doc/qt-4.8/qtabwidget.html já faz.
        • Se não for esse o objetivo, em termos de UX ("experiência do usuário"), é mesmo uma boa idéia essa combinação de vários botões x barra de rolagem?

        Espero ter ajudado,
        Anselmo

        Anselmo L. S. Melo (anselmolsm)

        1 Reply Last reply
        0
        • W Offline
          W Offline
          Waltton.scm
          wrote on last edited by
          #7

          Bem, eu estou tentando criar um fórum, deve pensar, cara louco, todos me aconselharam fazer na web msm, mas eu quero fazer com Qt( através de FTP), por mais que eu não consiga deixa-lo funcionando eu ja adquiri e continuo adquirindo um bom conhecimento no Qt que é o objetivo principal.
          Quanto a tentar herdar direto o QPushButton, eu tentei mas acho qui fiz alguma coisa errada, vou tentar fazer de novo herdando direto o QPushButton.

          Obrigado pela atenção, sou iniciante e tudo que sei aprendi só na internet, como eu não sei inglês, muitas vesses fica difícil.

          Qualquer resultado novo eu posto aqui.

          1 Reply Last reply
          0
          • W Offline
            W Offline
            Waltton.scm
            wrote on last edited by
            #8

            Eu consegui colocar a barra de rolagem, fazendo a classe MyButton herdar direto da QPushButton.
            !http://img860.imageshack.us/img860/2622/capturarq.gif(^^)!

            1 Reply Last reply
            0
            • W Offline
              W Offline
              Waltton.scm
              wrote on last edited by
              #9

              Mais um problema, bem parecido com esse anterior da barra de rolagem, vou postar duas imagens, uma onde não precisa da barra de rolagem e fica certinho...

              !http://img819.imageshack.us/img819/1702/cap01z.gif(...)!

              e outra onde precisa e fica um widget sobre o outro...

              !http://img69.imageshack.us/img69/2057/cap02.gif(...)!

              o problema me parece ser o mesmo, o outro eu resolvi fazendo a classe MyButton herdar direto da QPushButton, mas dessa vez não tem como pois o widget que eu insiro no Layout é o pai de um conjunto de outros widgets.

              1 Reply Last reply
              0
              • A Offline
                A Offline
                anselmolsm
                wrote on last edited by
                #10

                Onde deveria aparecer essa barra de rolagem, dentro da primeira célula da coluna tópico? Aquilo é o widget que você está disse estar tentando inserir?

                Anselmo L. S. Melo (anselmolsm)

                1 Reply Last reply
                0
                • W Offline
                  W Offline
                  Waltton.scm
                  wrote on last edited by
                  #11

                  a barra de rolagem aparece pois eu coloquei ScrollBarAlwaysOn...
                  !http://img15.imageshack.us/img15/209/cap01.gif(..)!

                  !http://img195.imageshack.us/img195/2057/cap02.gif(..)!

                  ela aparece mas não funciona, os widgets vão se "apertando" e se sobrepondo, deveria ficar todos como na primeira imagem.

                  1 Reply Last reply
                  0
                  • A Offline
                    A Offline
                    anselmolsm
                    wrote on last edited by
                    #12

                    Opa,

                    Coloca o trecho de código em que vc faz isso, fica mais fácil ajudar do que olhando só as imagens.

                    Anselmo L. S. Melo (anselmolsm)

                    1 Reply Last reply
                    0
                    • W Offline
                      W Offline
                      Waltton.scm
                      wrote on last edited by
                      #13

                      eu consegui concertar isso, eu coloquei no frame o tamanho minimo aí quando coloco muitos eles não diminuem de tamanho.
                      Desculpa o incomodo dessa vez. :/

                      1 Reply Last reply
                      0
                      • A Offline
                        A Offline
                        anselmolsm
                        wrote on last edited by
                        #14

                        Não precisa pedir desculpas :-)

                        Anselmo L. S. Melo (anselmolsm)

                        1 Reply Last reply
                        0
                        • F Offline
                          F Offline
                          flaviomarcio
                          wrote on last edited by
                          #15

                          é facil amigo

                          vc sempre tem o objeto em

                          #include <QObject>

                          QObject::sender()

                          ai para converter para a classe que vc precisa vc faz

                          QPushButton b=return static_cast<QPushButton>( QObject::sender() );

                          espero ter ajudado

                          Flavio Portela

                          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