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));
}