Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. International
  3. Portuguese
  4. Definindo ToolTip para menus e itens de menus
QtWS25 Last Chance

Definindo ToolTip para menus e itens de menus

Scheduled Pinned Locked Moved Portuguese
17 Posts 2 Posters 7.5k 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.
  • E Offline
    E Offline
    Exotic_Devel
    wrote on last edited by
    #2

    Bem, ontem postei uma dica de como usar ToolTips em menus, reescrevendo a classe QMenu. "ModQMenu":http://developer.qt.nokia.com/forums/viewthread/7225/

    Estou com um problema de travamento da aplicação quando uso a solução QMenu modificada (ModQMenu), quando faço uso dela para criar os menus, a app trava junto com todo o SO. Quando uso QMenu padrão roda direitinho.

    Será vazamento de memória?

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

      Legal a iniciativa de compartilhar a solução :-)

      Para fins históricos, segue a "thread original":http://developer.qt.nokia.com/forums/viewthread/7150/ (em inglês) onde há também o procedimento para QMenuBar.

      Anselmo L. S. Melo (anselmolsm)

      1 Reply Last reply
      0
      • E Offline
        E Offline
        Exotic_Devel
        wrote on last edited by
        #4

        Pois é anselmo, só que infelizmente estou tendo problemas com ela, quando usa essa solução para criar os menus, a aplicação trava e junto com ela todo o sistema operacional, só retornando com reset na máquina. Acabei de abrir um tópico sobre esse problema.

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

          Para travar o sistema inteiro deve ser algo mais sério e como você disse que com QMenu padrão o problema não acontece, pode ser algum passo da sua reimplementação.

          Qual SO você usa? Aqui (Linux) eu tentaria achar o problema utilizando ferramentas como valgrind, gdb.

          Para tentar reproduzir o erro aqui, você usou ModQMenu junto com o código que postou "nessa thread":http://developer.qt.nokia.com/forums/viewthread/7150/?

          Anselmo L. S. Melo (anselmolsm)

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

            "Respondido":http://developer.qt.nokia.com/forums/viewthread/7240/

            (/me pensando se não seria o caso de unir os 2 tópicos...)

            EDIT: link acima apontava para o tópico que foi unido a este.

            Anselmo L. S. Melo (anselmolsm)

            1 Reply Last reply
            0
            • E Offline
              E Offline
              Exotic_Devel
              wrote on last edited by
              #7

              Tb uso linux aqui, opensuse

              Não! Estou usando em um código com mais menus, Estou usando o ModQMenu para todos os menus.

              @#ifndef WINDOWMAIN_H
              #define WINDOWMAIN_H

              #include <QMainWindow>
              #include <QMdiArea>
              #include <QList>
              #include "ModQMenu.h"

              class WindowMain : public QMainWindow
              {
              Q_OBJECT

              public:
                  WindowMain(QWidget *parent = 0);
              
                  ~WindowMain();
              
              private:
              
                  QList <QAction *> listarquivos, listredunt, listconfig, listfiscal, listajuda, listrelatori,
                          listrelgerenci, listmoviment, listferrament;
              
                  // Area MDI
                  QMdiArea *mdiarea;
              
                  // Menus
                  ModQMenu *arquivos;
                  ModQMenu *relatorios;
                  ModQMenu *ferramentas;
                  ModQMenu *fiscal;
                  ModQMenu *moviment;
                  ModQMenu *configura;
                  ModQMenu *ajuda;
                  ModQMenu *redundantes;
                  ModQMenu *relgerencias;
              
                  // QActions de menus
                  QAction *clientes;
                  QAction *produtos;
                  QAction *forneced;
                  QAction *represen;
                  QAction *usuarios;
                  QAction *medicos;
                  QAction *sair;
                  QAction *enderecos;
                  QAction *marclente;
                  QAction *matelente;
                  QAction *tipopgto;
                  QAction *tipolente;
                  QAction *tratament;
                  QAction *restricoes;
                  QAction *autobackup;
                  QAction *bdconexao;
                  QAction *impressdoc;
                  QAction *leiturax;
                  QAction *reducaoz;
                  QAction *configicms;
                  QAction *manual;
                  QAction *queisso;
                  QAction *sobre;
                  QAction *relvenda;
                  QAction *relcaixa;
                  QAction *relespelhos;
                  QAction *relos;
                  QAction *partmedica;
                  QAction *partfuncio;
                  QAction *fatumensal;
                  QAction *fatudiario;
                  QAction *ranklentes;
                  QAction *rankfornec;
                  QAction *orcamentos;
                  QAction *devolucoes;
                  QAction *movicaixa;
                  QAction *ordemservic;
                  QAction *vendas;
                  QAction *contapagar;
                  QAction *contarecebe;
                  QAction *calcula;
                  QAction *callenbord;
                  QAction *compatarmlen;
                  QAction *backup;
              
                  void creatQMenus();
                  void creatQActions();
              

              private slots:
              void evoqueSubWind();

              };

              #endif // WINDOWMAIN_H
              @

              1 Reply Last reply
              0
              • E Offline
                E Offline
                Exotic_Devel
                wrote on last edited by
                #8

                Estou postando o código da aplicação, ainda está crua mesmo

                @#include <QApplication>
                #include <QTextCodec>
                #include <QDesktopWidget>
                #include <QRect>
                #include <QMenuBar>
                #include <QToolBar>
                #include <QStatusBar>

                #include "WindowMain.h"

                WindowMain::WindowMain(QWidget *parent):QMainWindow(parent)
                {
                creatQActions();
                creatQMenus();
                }

                void WindowMain::creatQActions()
                {
                clientes = new QAction(QIcon(":/icoclientes"), "Clientes", this);
                connect(clientes, SIGNAL(triggered()), this, SLOT(evoqueSubWind()));
                listarquivos << clientes;

                produtos = new QAction(QIcon(":/icoprodutos"), "Produtos", this);
                listarquivos << produtos;
                
                forneced = new QAction("Fornecedores", this);
                listarquivos << forneced;
                
                represen = new QAction("Representantes", this);
                listarquivos << represen;
                
                usuarios = new QAction("Usuários", this);
                listarquivos << usuarios;
                
                medicos = new QAction("Médicos", this);
                listarquivos << medicos;
                
                sair = new QAction(QIcon(":/icosair"), "Sair", this);
                sair->setShortcut(tr("CTRL+S"));
                connect(sair,SIGNAL(triggered()), qApp, SLOT(quit()));
                
                enderecos = new QAction("Endereços", this);
                listredunt << enderecos;
                
                marclente = new QAction("Marcas de Lente", this);
                listredunt << marclente;
                
                matelente = new QAction("Metariais de Lente", this);
                listredunt << matelente;
                
                tipopgto = new QAction("Tipos de Pagamento",this);
                listredunt << tipopgto;
                
                tipolente = new QAction("Tipos de Lente", this);
                listredunt << tipolente;
                
                tratament = new QAction("Tratamentos", this);
                listredunt << tratament;
                
                restricoes = new QAction(QIcon(":/icorestricoes"), "Restrinções", this);
                restricoes->setToolTip("Configura o acesso dos usuários ao sistema");
                listconfig << restricoes;
                
                autobackup = new QAction(QIcon(":/icoautoback"), "Backup Automático", this);
                autobackup->setToolTip("Configura o backup automático do sistema");
                listconfig << autobackup;
                
                bdconexao = new QAction(QIcon(":/icoconecbd"), "Conexão com o BD", this);
                bdconexao->setToolTip("Configura a conexão com o banco de dados");
                listconfig << bdconexao;
                
                impressdoc = new QAction("Impressão de Documentos", this);
                impressdoc->setToolTip("Define quais documentos terão impressão automática");
                listconfig << impressdoc;
                
                leiturax = new QAction("Leitura &X", this);
                listfiscal << leiturax;
                
                reducaoz = new QAction("Redução &Z", this);
                listfiscal << reducaoz;
                
                configicms = new QAction("Configurar &ICMS", this);
                listfiscal << configicms;
                
                manual = new QAction(QIcon(":/icomanual"),"Manual", this);
                listajuda << manual;
                
                queisso = new QAction("O que é isso?", this);
                listajuda << queisso;
                
                sobre = new QAction("Sobre o QtOpitca", this);
                listajuda << sobre;
                
                relvenda = new QAction("Relatório de Vendas", this);
                listrelatori << relvenda;
                
                relcaixa = new QAction("Relatório de Caixa", this);
                listrelatori << relcaixa;
                
                relespelhos = new QAction("Relatórios de Espelhos", this);
                listrelatori << relespelhos;
                
                relos = new QAction("Relatório de OS's", this);
                listrelatori << relos;
                
                ranklentes = new QAction("Ranking de Lentes", this);
                listrelatori << ranklentes;
                
                rankfornec = new QAction("Ranking de Fornecedores", this);
                listrelatori << rankfornec;
                
                fatumensal = new QAction("Faturameto Mensal", this);
                listrelgerenci << fatumensal;
                
                fatudiario = new QAction("Faturamento Diário", this);
                listrelgerenci << fatudiario;
                
                partmedica = new QAction("Participação Médica", this);
                listrelgerenci << partmedica;
                
                partfuncio = new QAction("Participação de Funcionários", this);
                listrelgerenci << partfuncio;
                
                orcamentos = new QAction(QIcon(":/icoorcament"), "Orçamentos", this);
                listmoviment << orcamentos;
                
                devolucoes = new QAction(QIcon(":/icodevoluc"), "Devoluções", this);
                listmoviment << devolucoes;
                
                ordemservic = new QAction(QIcon(":/icoos"), "Ordens de Serviço", this);
                listmoviment << ordemservic;
                
                vendas = new QAction(QIcon(":/icovendas"), "Vendas", this);
                listmoviment << vendas;
                
                movicaixa = new QAction("Movimento do Caixa", this);
                listmoviment << movicaixa;
                
                contapagar = new QAction(QIcon(":/icocontaspg"), "Contas a Pagar", this);
                listmoviment << contapagar;
                
                contarecebe = new QAction(QIcon(":/icocontasrc"), "Contas a Receber", this);
                listmoviment << contarecebe;
                
                calcula = new QAction(QIcon(":/icocalculator"), "Calculadora", this);
                listferrament << calcula;
                
                backup = new QAction(QIcon(":/icobackup"), "Backup", this);
                listferrament << backup;
                
                callenbord = new QAction("Calcular borda de lentes", this);
                listferrament << callenbord;
                
                compatarmlen = new QAction("Compatibilidade LENTE x ARMAÇÂO", this);
                listferrament << compatarmlen;
                

                }@

                1 Reply Last reply
                0
                • E Offline
                  E Offline
                  Exotic_Devel
                  wrote on last edited by
                  #9

                  Cont......

                  @void WindowMain::creatQMenus()
                  {

                  redundantes = new ModQMenu("Redundantes", this);
                  redundantes->addActions(listredunt);
                  
                  arquivos = new ModQMenu("&Arquivos", this);
                  menuBar()->addMenu(arquivos);
                  arquivos->addActions(listarquivos);
                  arquivos->addSeparator();
                  arquivos->addMenu(redundantes);
                  arquivos->addSeparator();
                  arquivos->addAction(sair);
                  
                  moviment = new ModQMenu("&Movimentação", this);
                  menuBar()->addMenu(moviment);
                  moviment->addActions(listmoviment);
                  
                  ferramentas = new ModQMenu("&Ferramentas", this);
                  menuBar()->addMenu(ferramentas);
                  ferramentas->addActions(listferrament);
                  
                  fiscal = new ModQMenu("Fisca&l", this);
                  menuBar()->addMenu(fiscal);
                  fiscal->addActions(listfiscal);
                  
                  relgerencias = new ModQMenu("Relatórios Gerenciais", this);
                  relgerencias->addActions(listrelgerenci);
                  
                  relatorios = new ModQMenu("&Relatórios", this);
                  menuBar()->addMenu(relatorios);
                  relatorios->addActions(listrelatori);
                  relatorios->addSeparator();
                  relatorios->addMenu(relgerencias);
                  
                  configura = new ModQMenu("&Configurações", this);
                  configura->addActions(listconfig);
                  menuBar()->addMenu(configura);
                  
                  ajuda = new ModQMenu("A&juda", this);
                  menuBar()->addMenu(ajuda);
                  ajuda->addActions(listajuda);
                  

                  }

                  void WindowMain::evoqueSubWind()
                  {
                  }

                  WindowMain::~WindowMain()
                  {
                  delete mdiarea;
                  }
                  @

                  1 Reply Last reply
                  0
                  • E Offline
                    E Offline
                    Exotic_Devel
                    wrote on last edited by
                    #10

                    hehe pode ser, se tiver como vc fazer pode unir

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

                      [quote author="matheusssilva_BR" date="1309267199"]
                      Não! Estou usando em um código com mais menus, Estou usando o ModQMenu para todos os menus.
                      [/quote]

                      Para você não precisar por o código inteiro da sua aplicação aqui, talvez seja mais fácil fazer o seguinte: criar um exemplo menor, usando suas classes de menu e que consiga reprodizir o problema.

                      Anselmo L. S. Melo (anselmolsm)

                      1 Reply Last reply
                      0
                      • E Offline
                        E Offline
                        Exotic_Devel
                        wrote on last edited by
                        #12

                        Resolvi tb postar o código inteiro pois acredito que fazendo um teste com apenas 1 ou 2 menus o problema não aparece, pois logo começo eu testei com apenas 3 menus e funcionou perfeitamente, depois que eu passei a usar em todos os menus da app, foi que começou a apresentar esse problema.

                        Talvez eu teria que criar a mesma quantidade de menus para o problema poder aparecer.

                        1 Reply Last reply
                        0
                        • E Offline
                          E Offline
                          Exotic_Devel
                          wrote on last edited by
                          #13

                          Acabei de testar apenas no menu 'configura', normal, normal. Mas se eu usar em todos os menus ai dá pau. Isso ta cheirando a sobrecarga de memória, será que não ?

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

                            OK, aqui dá segmentation fault.

                            Uma forma de reproduzir o problema: Abra um menu ("Arquivo", por exemplo), deixe-o aberto e mova o mouse para fora dele. Deixe o mouse imóvel por alguns instantes, ou seja, gere um evento de tooltip e.... crash.

                            Esse dá pra reproduzir com apenas 1 menu. O que acontece quando você tem mais menus é que fica mais fácil reproduzir, embora não saiba exatamente como.

                            Se você rodar num debugger, verá logo de cara que ao fazer o que descrevi acima você terá o ponteiro act nulo, o que quebra seu

                            @
                            if(act->toolTip() != act->text()))
                            @

                            Mudar para

                            @
                            if(act&&(act->toolTip() != act->text()))
                            @

                            resolve esse problema. Ainda não consegui reproduzir outros casos em que seu código dá crash, quem sabe mais tarde.

                            Anselmo L. S. Melo (anselmolsm)

                            1 Reply Last reply
                            0
                            • E Offline
                              E Offline
                              Exotic_Devel
                              wrote on last edited by
                              #15

                              ummm analisando agora fica óbvio helpevt->pos() retorna a posição do mouse se actionAt() receber uma posição que não tenha nenhum QAction nela ele vai retornar Null. Eu tentei usar o debugger do Qt Creator, mas fica impossivel analisar pq aqui o sistema todo para, tendo que dar reset na máquina para voltar.

                              Vc disse que além desse caso ainda tem outros que gera null pointer ?

                              p.s Saudades do Java nessa hora em... Em java ele dispararia uma exceção null pointer exception e me indicaria a linha que estava gerando. :-) , mas.... é c++ então vamos nessa...

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

                                [quote author="matheusssilva_BR" date="1309284041"]
                                Mas o que está retornando nulo é act->toolTip() ou act->text() ?
                                [/quote]

                                act chega nulo nesse if. O passo anterior está retornando nulo nesse cenário identificado.
                                O segmentation fault acontece quando da tentativa de chamar os métodos text() e toolTip() de um objeto que não está lá.

                                [quote author="matheusssilva_BR" date="1309284041"]
                                O que if(act) testa?
                                Testa se o ponteiro é nulo?
                                [/quote]

                                Sim. Equivale a fazer if (act != 0).

                                [quote author="matheusssilva_BR" date="1309284041"]ummm, eu tentei usar o debugger do Qt Creator, mas fica impossivel analisar pq aqui o sistema todo para, tendo que dar reset na máquina para voltar.
                                [/quote]

                                Bom, pode ser pouca RAM... foi exatamente o que eu fiz aqui (e olha que os 2GB de RAM que tenho aqui já não é tanta coisa hj em dia) :-P

                                [quote author="matheusssilva_BR" date="1309284041"]
                                Vc disse que além desse caso ainda tem outros que gera null pointer ?
                                [/quote]

                                Disse que consegui identificar como reproduzir 1 dos casos, se tem mais precisa procurar ;)

                                Anselmo L. S. Melo (anselmolsm)

                                1 Reply Last reply
                                0
                                • E Offline
                                  E Offline
                                  Exotic_Devel
                                  wrote on last edited by
                                  #17

                                  Desculpe por remover as perguntas mas é que estudando o código consegui as respostas.

                                  Bem pouca RAM não é, tenho 4 giga DDR3, não sei pq então.

                                  Bem eu só tinha identificado esse erro até o momento.

                                  Meu debugger tb não ta legal quando rodo em debugger gera um warning na saída

                                  warning: GDB: Failed to Set terminal de controle: Argumento inv \ 303 \ 241lido \ n

                                  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