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
    #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