Drag and Drop
Drag and drop fornece um mecanismo visual simples que os usuários podem usar para transferir informações entre e dentro dos aplicativos. Drag and drop fornece um mecanismo visual simples que os usuários podem usar para transferir informações entre e dentro dos aplicativos.
As operações de Drag and drop também são suportadas por muitos dos controles do Qt, como as visualizações de itens e a estrutura de visualização de gráficos, bem como controles de edição para Qt Widgets e Qt Quick. Mais informações sobre visualizações de itens e visualização de gráficos estão disponíveis em Usando arrastar e soltar com visualizações de itens e Estrutura de visualização de gráficos.
Este artigo demonstra como implementar arrastar e soltar um texto de QListWidget em um QGraphicsItem. Duas variantes do problema são apresentadas:
Variante 1: Com reutilização - o texto não será excluído do QListWidget após ter sido solto em um QGraphicsItem
Variante 2: Sem reutilização - o texto será excluído do QListWidget depois de ter sido solto em um QGraphicsItem. O texto não pode ser arrastado de volta para o QListWidget, no entanto, o texto aparecerá no QListWidget assim que o usuário selecionar um item/itens e pressionar a tecla delete.
Para alcançar a funcionalidade desejada, precisamos fazer o seguinte:
- habilitar arrastar de QListWidget com QListWidget::setDragEnabled(true)subclasse QGraphicsItem (no nosso caso QGraphicsRectItem), habilite a eliminação com setAcceptDrops(true) e implemente o método dropEvent(QGraphicsSceneDragDropEvent *event) recuperar os dados codificados arrastados do QListWidget no formato "application/x-qabstractitemmodeldatalist" no dropEvent() do QGraphicsRectItem personalizado
- substituir QMainWindow::keyPressEvent(QKeyEvent *event) para permitir a remoção do texto de QGraphicsItems com a tecla delete
As variantes diferem apenas na implementação de dropEvent(QGraphicsSceneDragDropEvent *event) no CustomRectItem derivado e em keyPressEvent(QKeyEvent *event) no MainWindow derivado.
Como subclassificar QGraphicsRectItem:
Abaixo está o cabeçalho da subclasse QGraphicsRectItem que deve ser capaz de aceitar quedas. Como também queremos que o item aceite e exiba texto, mantemos o texto como uma variável privada, adicionamos um método de acesso e um modificador e sobrescrevemos o método paint para exibir o texto. Para realizar o arrastar e soltar real, temos que implementar o dropEvent().
class CustomRectItem : public QGraphicsRectItem
{
public:
CustomRectItem(QGraphicsItem * parent = 0);
void dropEvent(QGraphicsSceneDragDropEvent *event);
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
void setText(const QString& text);
QString text() const {return m_text;}
private:
QString m_text;
};
No customrectitem.cpp observe que no construtor do CustomRectItem habilitamos drops e tornamos o item selecionável, para que o texto possa ser removido dos itens se desejado.
CustomRectItem::CustomRectItem(QGraphicsItem *parent):
QGraphicsRectItem(parent)
{
setAcceptDrops(true);
setFlags(QGraphicsItem::ItemIsSelectable);
}
void CustomRectItem::setText(const QString &text){
this->m_text = text;
update();
}
void CustomRectItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
QWidget *widget){
QGraphicsRectItem::paint(painter, option, widget);
painter->drawText(boundingRect(),m_text,
QTextOption(Qt::AlignCenter));
}