Como implementar o widget arrastar e soltar em outro contêiner em qt?[fechado]
Pergunta
Tenho uma janela com vários containers.Qual é a maneira mais simples de implementar arrastar e soltar entre eles?
Solução
Você tem que usar um QDrag*
objeto.Então reimplemente:
virtual void mousePressEvent(QMouseEvent * event);
virtual void mouseReleaseEvent(QMouseEvent * event);
virtual void mouseMoveEvent(QMouseEvent *event);
Dentro desses eventos você gerenciará um ponto inicial (onde começa o arrasto) e um ponto final (onde você solta o widget).Você também usará o protocolo MIME para permitir que a estrutura gerencie a operação arrastar e soltar.
Um artigo mais útil sobre arrastar e soltar é este: Arraste e solte
Outras dicas
A maneira mais fácil, suponho, seria criar eventFilter
classe, onde você filtraria eventos de arrastar e soltar e instalar isto (someWidget->installEventFilter
) para todos os seus widgets, onde você deseja arrastar e soltar.Exemplo de documentos - aqui
atualizar:
O problema com o eventfilter é que você não precisa subclassificar todos os seus widgets para que eles possam arrastar e soltar.Basta instalar o filtro em qualquer widget que você deseja ter o filtro dnd e ele o terá.
Quanto ao filtro em si, ele nem sempre bloqueia eventos, etc. (fará isso se essa for sua intenção).Foi apenas um exemplo de como alguém pode usá-lo.
Apenas uma das inúmeras opções de arrastar e soltar:em dropEvent, dragMoveEvent, dragEnterEvent seu filtro possivelmente lembrará o ponteiro para o que você deseja soltar e em dropEvent emitirá sinal com o objeto, esse evento segura o ponteiro e o captura com o widget onde você o solta, e pronto, qualquer widget que tenha o filtro instalado terá o recurso de arrastar e soltar.
O objetivo do filtro de eventos é NÃO se preocupar com subclasses e conectar CADA widget se você tiver o tipo de evento comum, deseja capturar e processar de maneira semelhante, como arrastar e soltar eventos, por exemplo.
Presumi que você soubesse arrastar e soltar, mas pensei que substituir eventos em todos os widgets com o mesmo código repetidamente poderia não ser tão certo.Então eu mostrei como isso pode ser feito facilmente com um filtro de eventos para todos os widgets que você deseja arrastar e soltar.