quinta-feira, 4 de agosto de 2016

Blog foi Descontinuado

O novo endereço do blog é: http://www.icaromotta.com/blog/

Esse blogspot foi mantido apenas como material de consulta e não será mais atualizado.

terça-feira, 24 de setembro de 2013

QT: Trocando o cursor do mouse

Em alguns projetos há a necessidade de trocar o cursor do mouse para indicar ao usuário que houve alguma mudança, uma troca de ferramenta por exemplo. Com QT podemos trocar o cursor facilmente com apenas alguns comandos.

Quando precisamos informar para o usuário que o sistema está calculando algo que vai demorar para ser finalizado, podemos sobrescrever o cursor ativo por um cursor global de espera que indicará que o sistema está ocupado. É necessário restaurar o cursor após sobrescrever o cursor global, pois senão não haverá interação com Widgets de modo geral.

Exemplo:

QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
calculate();            
QApplication::restoreOverrideCursor();


Essa função não é muito útil para o uso em geral nas aplicações, pois remove o poder de troca de cursor que o QT dá para cada Widget especificamente.

Com QT podemos programar para cada Widget como que o mouse se comportará quando estiver dentro dele. Podemos usar enumeradores que são estáticos no QT ou usar imagens customizáveis por nós mesmos:

Exemplo enumerador:

mWidget->setCursor(QCursor(Qt::CrossCursor))

Exemplo customizável:

//com esse comando podemos escalar a imagem para o tamanho adequado
QPixmap pix = QPixmap("ponteirocustomizavel.png").scaled(32,32, Qt::KeepAspectRatio, Qt::SmoothTransformation);
QCursor c = QCursor(pix);
mWidget->setCursor(c);



Geralmente muda-se o ponteiro apenas quando este estiver dentro do centralWidget do MainWindow, logo basta usar a função setCursor() do centralWidget assim:

mMainWindow->setCursor(QCursor(Qt::CrossCursor));

segunda-feira, 5 de agosto de 2013

QT: Usando estilos e StyleSheets no Qt Designer

Quando programamos utilizando o framework QT, podemos configurar estilos e StyleSheets para a aplicação.

Estilos são pré-definidos pelo sistema. Para configurar estilos via código utilizamos as seguintes linhas:


//QApplication::setStyle(QStyleFactory::create("plastique"));
//QApplication::setStyle("plastique");
//QApplication::setStyle("motif");
//QApplication::setStyle("windows");
//QApplication::setStyle("cde");
//QApplication::setStyle("gtk");
QApplication::setStyle("cleanlooks");
//QApplication::setStyle("windowsxp");
//QApplication::setStyle("windowsvista");
//QApplication::setStyle("macintosh");

Faça testes para perceber as modificações entre os diferentes estilos acima.

StyleSheets são especificações textuais que podem customizar a aplicação inteira ou widgets específicos. Para customizar, usamos a linguagem QSS inspirada no CSS. Um exemplo pode ser visto abaixo:

QLineEdit { background:yellow }
QCheckBox { color: red }

Deixarei um StyleSheet black/orange no meu repositório para que possam baixar e usar:

clique aqui para o download   (themes.rar)

Esse estilo usa alguns recursos ( imagens), então é necessário criar um arquivo de recursos de qt e executar o rcc.exe sobre o .qrc criado para gerar um arquivo .rcc. O exe rcc se encontra na pasta bin do Qt. Os recursos precisam estar em alguma pasta criada na raiz onde se encontra o StyleSheet.

Apenas baixe o link acima e descompacte dentro de alguma pasta de seu projeto. Há um arquivo bat que terá que ser editado. Abra-o informe o caminho correto para o rcc.exe. Qualquer dúvida, deixe nos comentários.

Qt Designer

Agora que já temos o StyleSheet, podemos configurar o QtDesigner para que user o estilo que desejamos e o StyleSheet que criamos.


  • Abra o Qt Designer.
  • Entre no menu Settings->Preferences.
  • Clique na aba Forms.
  • Marque o check box Print/Preview Configuration.
  • Escolha o estilo desejado em style.
  • Abra o StyleSheet baixado num editor de texto e copie todo código.
  • Clique no botão "..." e cole todo código na caixa de diálogo que apareceu.
  • Confirme as mudanças.
  • Crie uma janela com alguns botões e execute um preview.
  • Menu Form->Preview ou aperte as teclas Ctrl + R

Como esse StyleSheet usa recursos, e caso o designer por exemplo, queira ver as imagens do checkbox checado dentro do Qt Designer, será necessário ir nos recursos da janela criada e adicionar o arquivo resources_qt.qrc para ver essas imagens no preview.

A janela mostrada no editor usa o estilo padrão, para ver as mudanças só executando um preview.

Para aprender mais sobre StyleSheets visite o link oficial do qt: link

Uma janela bem tosca como exemplo:

black orange qt


quarta-feira, 15 de maio de 2013

Customizando instalador msi

Nesse tutorial, irei ensinar como customizar instaladores gerados pelo Visual Studio principalmente.

Todos que começam a trabalhar com o Setup Project do Visual Studio, descobrem que este é muito limitado. As vezes queremos trocar o título da janela mas manter o productName normal e não conseguimos.

A Microsoft sabendo que os programadores queriam mais opções criou um programinha chamado Orca que vem junto com o SDK do Windows 7. Colocarei aqui o link da Microsoft ensinando a usar o Orca, porém para fazer isso você terá que baixar cerca de 4 GB do SDK. Então, upei esse instalador do Orca para meu repositório nas nuvens ( não garanto que vai funcionar com apenas este instalador).

Link da Microsoft para o SDK


Baixar apenas o instalador Orca


Instale o Orca e o abra após a instalação. Agora basta usar CTRL + F e busque pela string que deseja alterar. Altere todas as strings desejadas e salve o arquivo. Não mexa em valores que você não saiba o que, pois você pode acabar comprometendo o arquivo de instalação.

segunda-feira, 13 de maio de 2013

Gerando instalador pelo Visual Studio

Introdução


Vamos aprender nesse tutorial como gerar um instalador básico pelo próprio Visual Studio. Alguns programadores desconhecem essa possibilidade e acabam procurando outros programas para executar essa tarefa. Para quem usa o Visual Studio para programar, então, talvez não há a necessidade de procurar outro programa apenas parar gerar o instalador. Vamos lá.

Aprendendo


  • Antes de tudo, é necessário que sua aplicação esteja pronta. Então agora, basta criar um novo projeto. Então clique com o botão direito em Solution Explores e adicione um novo projeto. Ou entre no menu arquivo (File) e crie um novo projeto: 



  • Selecione ->Other Project Types –> Setup and Deployment –> Visual Studio Installer –> Setup Project




  • Abra a janela de propriedades. ( View->Other Windows -> Properties Window), e depois clique em cima projeto. Aparecerá na janela vários valores que podem ser configurados. Preencha todos os valores se possível.


AddRemoveProgramsIcon: Adiciona um Ícone no seu pacote de instalação

Author: informe o autor do projeto no caso você

Description: informe uma breve descrição do sistema

InstallAllUsers: Ser for True instala para todos os usuários da máquina

Localization: Mude para portuguese(Brazil), que a aplicação ficará em português

Manufacturer: informe a empresa que desenvolveu

ManufactureUrl: informeo site da empresa que desenvolveu

ProductCode: é o identificador da aplicação após a instalação. Esta propriedade pode ser usada para detectar se a aplicação já está instalada. E também usada para desinstalar a aplicação.

ProductName: é utilizada por algumas telas durante a instalação e pode ser utilizada como variável para definir por exemplo a pasta de destino da aplicação após a instalação.
    Target Plataform: x86 para maquinas convencionais e x64 para plataforma 64bits. Essa informação precisa ser preenchida de acordo com o executável gerado de nossa aplicação.

    • Agora, precisamos adicionar todos os arquivos necessários para nosso programa funcionar de acordo com a hierarquia das pastas para que o executável consiga encontrar os recursos. Para fazer isso, clique com o botão direito do mouse em cima do projeto->view->File System



    • O File System já três pastas como padrão: Application Folder, User's Desktop e User's Programs Menu.












    • Em Application Folder é onde será colocado as pastas que contem os arquivos de nossa aplicação. É sempre bom deixar a janela de propriedades visível para saber o que é possível configurar. A propriedade Default Location por exemplo é onde o programa será instalado. Geralmente fica no arquivos de programa.
    • Em User's Desktop será colocado o atalho que vai para a área de trabalho
    • Em User's Programs Menu, é como nosso programa será mostrado no menu iniciar.


    Application Folder


    • Criando pastas em Application Folder: Clique com o botão contrário do mouse em cima de Application Folder -> Add -> Folder.
    • Podemos criar outra pasta dentro da pasta criada ou podemos criar arquivos.
    • Para criar arquivos: Clique com o botão direito do mouse em cima pasta desejada depois em Add e depois em File. 




    Outra forma muita mais prática de adicionar arquivos a pasta desejada é indo pela própria pasta no windows explorer e arrastar todos os arquivos de uma vez para dentro da pasta de destino contida na janela do Visual Studio.

    User's Desktop



    • Criando atalho: botão direito em User's Desktop depois clique em Create Shortcut to ... . Agora nomeei o atalho e informe o arquivo executável da aplicação configurando o campo Target na janela de propriedades.


    User's Program Menu



    • Para adicionar pastas: Botão direito -> Add -> Folder
    • Para adicionar atalhos: Botão direito - > Create Shortcut to   e configure o campo Target.



    Finalização


    Agora basta clicar em build que o instalador será gerado. Mas antes de finalizar o instalador é aconselhável criar um desinstalador para o usuário não precisar entrar em Adicionar e Remover Programas apenas para desinstalar sua aplicação.


    Desinstalador


    Para criar um atalho para o desinstalador, precisamos seguir os seguintes passos.


    • Entramos em File System e clicamos com o botão direito em File System on Target Machine -> Add Special Folder -> System Folder





    • Agora clique botão direito em cima de System Folder e adicionar arquivo. Procure o arquivo msiexec.exe dentro da pasta Windows/System32/msiexec.exe e confirme a operação.
    • Clique no arquivo adicionado e configure suas propriedades na janela de propriedades.


    Condition = Not Installed
    Exclude = False
    Hidden = False
    Permanent = True
    ReadOnly = False
    SharedLegacyFile = False
    System = True
    Transitive = True
    Vital = false


    • Agora precisamos criar o atalho para o desinstalador no menu Iniciar. Para isso, siga os passos anteriores de como criar um atalho no Menu Iniciar. Após criado o atalho, clique nele e configure as propriedades para

    Arguments = /x [ProductCode]
    Target = informe o arquivo msiexec.exe da pasta system folder que acabamos de criar.



    • O argumento passado para Arguments é o padrão para esse executável. Assim informamos que queremos desinstalar do windows o programa com o ProductCode correspondente. Poderíamos passar o ProductCode na mão como por exemplo: /x {C9088BE1-C4B3-4B93-9D45-F570365C5F3A}. Mas não teria sentido ter que ficar mudando toda hora que formos fazer um novo instalador.


    Agora basta compilar Novamente.


    Possíveis Bugs no Desinstalador


    Alguns computadores com Windows 7 estão tendo problemas com o desinstalador criado pelo visual studio por causa de um arquivo de sistema chamado Desktop.ini localizado na área de trabalho pública.

    Esse arquivo precisa ser alterado, só que ele está somente como leitura. Então precisamos alterá-lo para escrita e leitura antes de chamarmos o desinstalador. Para conseguirmos essa proeza, precisamos criar uma ação customizada no projeto. Criamos da seguinte forma:

    •  Criar novo Projeto -> Visual C# -> Class Library


    • Removemos Class.cs que foi criado e adicionamos um novo tipo de arquivo chamado Installer Class. Agora precisamos sobrescrever alguns métodos. Clique com o botão direito em cima de Installer1.cs e em seguida clique em View code.


    • O código mostrado será esse:
    using System; 
    using System.Collections; 
    using System.Collections.Generic; 
    using System.ComponentModel; 
    using System.Configuration.Install; 
    using System.Linq; 

    namespace CustomAction2 

      [RunInstaller(true)] 
      public partial class Installer1 : System.Configuration.Install.Installer 
      { 
        public Installer1() 
        { 
           InitializeComponent(); 
        } 

      } 


    Então mudaremos o código para:

    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Configuration.Install;
    using System.Linq;
    using System.Windows.Forms;


    namespace CustomAction2
    { [RunInstaller(true)]
      public partial class Installer1 : System.Configuration.Install.Installer
      {
         public Installer1()
         {
            InitializeComponent();
         }

    [System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand)]
         public override void Install(IDictionary stateSaver)
         {
            base.Install(stateSaver);
         }

    [System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand)]
         public override void Commit(IDictionary savedState)
         {
            base.Commit(savedState);
         }

    [System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand)]
         public override void Rollback(IDictionary savedState)
         {
            base.Rollback(savedState);
         }

    [System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand)]
         public override void Uninstall(IDictionary savedState)
         {
             string deskDirectory =      Environment.GetFolderPath(Environment.SpecialFolder.CommonDesktopDirectory);
             string pathComplete = deskDirectory + "/desktop.ini";

             if (System.IO.File.Exists(pathComplete))
             {
                System.IO.FileAttributes attributes =     System.IO.File.GetAttributes(pathComplete);

                if ((attributes & System.IO.FileAttributes.ReadOnly) == System.IO.FileAttributes.ReadOnly)
                {
                   attributes = RemoveAttribute(attributes, System.IO.FileAttributes.ReadOnly);
                   System.IO.File.SetAttributes(pathComplete, attributes);
                }
             }

             base.Uninstall(savedState);
         }

         private static System.IO.FileAttributes RemoveAttribute(System.IO.FileAttributes attributes, System.IO.FileAttributes attributesToRemove)
         {
             return attributes & ~attributesToRemove;
         }
       }
    }



    FIM

    sexta-feira, 10 de maio de 2013

    Gravação automática de senhas nos navegadores

    Uma coisa que muita gente tem costume de fazer e que depois de ler essa postagem nunca mais deveria fazer é gravar a senha de qualquer página da internet nos navegadores. Como por exemplo, gravar senhas do facebook, email, google +, etc.

    Mas por que você não deve gravar mais as senhas? Simples, existe um conhecimento simples de HTML (HyperText Markup Language, que significa Linguagem de Marcação de Hipertexto: uma linguagem de marcação utilizada para produzir páginas na Web) que informa quais são os caracteres escondidos atrás dos ******.

    Antes de ensinar como usar esse comando simples, primeiro vamos aprender como é a sintaxe de um campo de senha em HTML.

    Senha <input type="password" name="senha"> </input>
    


    A única diferença de um campo texto para um campo senha é que ao invés do tipo ser "password" será "text".

    Nome <input type="text" name="nome"> </input>


    Com esse conhecimento básico agora fica fácil para qualquer pessoa conseguir pelo seu computador ou remotamente ir na página em que você gravou sua senha e no campo senha seguir os seguintes passos (pelo Google Chrome):


    • botão direito no campo senha;
    • clique em inspecionar elemento




    • clique duas vezes no tipo password;
    • e altere o texto de password para text e aperte enter;




    • olhe para o campo senha. Mágica? Não!





    Lembrem-se de se protegerem contra possíveis ataques! Claro que a pessoa poderia entrar diretamente no sua conta para fazer possíveis edições, mas sabendo a senha tudo fica mais fácil. Até a exclusão do próprio facebook. Há pessoas que usam a mesma senha pra todas as contas, então fiquem atentos!