quinta-feira, 12 de março de 2015

ScrollArea e Qt: uma briga contante

O Qt tem muita coisa bacana, e a documentação é bem completa e útil. Mas as vezes é bem difícil descobrir como se faz algo "simples". Dessa vez eu estava tentando capturar o evento de rolagem do mouse (a "rodinha" ou mouse wheel) para permitir ao usuário efetuar zoom na imagem em exibição. A organização visual é de fato simples: eu tenho um componente (widget) customizado que contém uma QScrollArea e dentro dela uma QLabel com a imagem.

O problema é que o QScrollArea já captura e trata esse evento do mouse: ele usa pra rolar tanto vertical (a rodinha do mouse usada sozinha) como horizontalmente (a rodinha do mouse usada quando a tecla Alt está pressionada) quando a imagem é maior do que a área de visualização. E então, ele simplesmente não repassa o evento para que ele possa ser capturado pelo componente externo. Também não há nenhum sinal que possa ser conectado a um método para fazer isso.

Afortunadamente, eu encontrei essa postagem muito bacana que sugere o uso de filtros de evento para fazer justamente isso: fazer com que o QScrollArea simplesmente não receba o evento, que assim não vai ser tratado e continuará a ser encaminhado até o componente mais externo. Bom, eu não queria ter que reimplementar todo o tratamento de rolagem já muito bem realizado pelo QScrollArea, então eu usei o método QApplication::keyboardModifiers() para ignorar o evento apenas quando a tecla Ctrl estiver pressionada (pois ai sim eu aplicarei o zoom intencionado).

Eis o exemplo de código:

// +-----------------------------------------------------------
ChildWindow::ChildWindow(QWidget* pParent) :
    QWidget(pParent)
{
. . .
// Make the scroll ignore the mouse wheel events
// (they will be handled at this class scope). 
m_pScrollArea->viewport()->installEventFilter(this);
. . .
}

// +-----------------------------------------------------------
bool ChildWindow::eventFilter(QObject *pObject, QEvent *pEvent)
{
// Ignore the mouse wheel events if the Ctrl key is pressed
bool bCtrl = QApplication::keyboardModifiers() &
Qt::ControlModifier;
if(pEvent->type() == QEvent::Wheel && bCtrl)
{
pEvent->ignore();
return true;
}
return false;
}

// +-----------------------------------------------------------
void f3::ChildWindow::wheelEvent(QWheelEvent *pEvent)
{
QPoint oPixels = pEvent->pixelDelta();
  QPoint oDegrees = pEvent->angleDelta() / 8;
QPoint oSteps = oDegrees / 15;

QPoint oDelta = !oPixels.isNull() ? oPixels : oDegrees;

// Scale the image based on the wheel delta
scaleImageBy(oDelta);

pEvent->accept();
}

terça-feira, 3 de fevereiro de 2015

Como converter vídeos para diferentes formatos de forma fácil e prática

Se você também precisa converter algum vídeo (no meu caso, a necessidade decorre do fato do meu equipamento multimídia ser um tanto antigo e só aceitar o formato AVI), precisa conhecer a ferramenta FFmpeg. Trata-se de um aplicativo de código aberto, disponível para múltiplas plataformas, e que permite fazer inúmeras coisas bacanas - entre elas converter rapidamente e com qualidade entre vários formatos de arquivos de vídeo.

sábado, 17 de janeiro de 2015

Executando o Ubuntu em tela cheia no Hyper-V

Se você já precisou usar o Hyper-V (no Windows 8, por exemplo) rodando uma máquina virtual do Ubuntu já deve ter percebido que o modo de tela cheia as vezes não usa toda a tela do seu monitor, e a configuração do Ubuntu mostra uma resolução máxima bem menor do que aquela que o seu monitor suporta.

Fuçando na Internet descobri uma maneira de configurar o Ubuntu para que ele force uma resolução que você deseja diretamente como um parâmetro do kernel (traduzido da fonte original):

1. No Ubuntu rodando dentro da máquina virtual, abra um terminal e digite (você também pode editar o arquivo 'grup' no editor de sua preferência se não curtir muito usar o vi):

sudo vi /etc/default/grub

2. Procure pela linha com o parâmetro GRUB_CMDLINE_LINUX_DEFAULT. Adicione a esse parâmetro o valor "video=hyperv_fb:1280x1024" (a informação com a resolução desejada no seu monitor, sem as aspas). Vai ficar assim:

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash video=hyperv_fb:1280x1024"

3. Salve o arquivo e execute o seguinte comando para atualizar:

sudo update-grub

4. Agora é só reiniciar a sua máquina virtual e tádá! :)

Muito útil!

:wq