#include <QApplication>
#include <QStandardItemModel>
#include <QTreeView>
#include <QMouseEvent>
//////////////////////////////////////////////////////
// This is so we can provide "drag from" to the main window.
{
Q_OBJECT
public:
DragAndDropTreeView
(QObject * parent
) ;
public slots:
protected:
int _activeItem ;
bool _mouseDown ;
bool _displayingShadow ;
} ;
DragAndDropTreeView
::DragAndDropTreeView(QObject * parent
){
_mouseDown = false ;
_displayingShadow = false ;
setMouseTracking(true);
}
void DragAndDropTreeView
::mousePressEvent(QMouseEvent * e
) {
_clickPoint = e->pos() ;
setCursor(Qt::ClosedHandCursor);
// this is ugly, and probably inefficient.
_activeItem = selectedIndexes()[0].sibling(selectionModel()->currentIndex().row(),0).data().toInt() ; ;
_mouseDown = true ;
}
void DragAndDropTreeView
::mouseMoveEvent(QMouseEvent * e
) {
if (!_mouseDown)
{
return ;
}
{
return;
}
if (drag == NULL) return ;
if (mime == NULL) return ;
drag->setMimeData(mime) ;
mime
->setText
(QString("Temp/%1").
arg(_activeItem
));
// note to the unwary !! THIS BLOCKS!
drag->exec() ;
}
void DragAndDropTreeView
::mouseReleaseEvent(QMouseEvent * e
) {
_mouseDown = false ;
}
// this is called properly before any drag event - but not after.
void DragAndDropTreeView
::ItemEntered(const QModelIndex & index
) {
_displayingShadow = true ;
}
int main(int argc, char * argv[])
{
DragAndDropTreeView * DDTV = new DragAndDropTreeView(NULL) ;
// set up the model to accept data.
// slap some stuff in.
_model
->setHeaderData
(0, Qt
::Horizontal,
QObject::tr("Number"));
for (int i = 0 ; i < 10 ; i++)
{
_model->insertRow(i);
_model
->setData
(_model
->index
(i,
0),
QString("%1").
arg(i
));
}
// show all the beauty of it
DDTV->setRootIsDecorated(false) ;
DDTV->setModel(_model) ;
DDTV->setDragEnabled(true) ;
DDTV->setSortingEnabled(true) ;
DDTV->show() ;
return app.exec();
}
#include <QApplication>
#include <QStandardItemModel>
#include <QTreeView>
#include <QMouseEvent>
//////////////////////////////////////////////////////
// This is so we can provide "drag from" to the main window.
class DragAndDropTreeView : public QTreeView
{
Q_OBJECT
public:
DragAndDropTreeView(QObject * parent) ;
public slots:
void ItemEntered(const QModelIndex & index) ;
protected:
void mousePressEvent(QMouseEvent *) ;
void mouseMoveEvent(QMouseEvent *) ;
void mouseReleaseEvent(QMouseEvent *) ;
QPoint _clickPoint ;
int _activeItem ;
bool _mouseDown ;
bool _displayingShadow ;
} ;
DragAndDropTreeView::DragAndDropTreeView(QObject * parent)
{
_mouseDown = false ;
_displayingShadow = false ;
setMouseTracking(true);
connect(this,SIGNAL(entered(const QModelIndex &)),this,SLOT(ItemEntered(const QModelIndex &))) ;
}
void DragAndDropTreeView::mousePressEvent(QMouseEvent * e)
{
_clickPoint = e->pos() ;
setCursor(Qt::ClosedHandCursor);
QTreeView::mousePressEvent(e) ;
// this is ugly, and probably inefficient.
_activeItem = selectedIndexes()[0].sibling(selectionModel()->currentIndex().row(),0).data().toInt() ; ;
_mouseDown = true ;
}
void DragAndDropTreeView::mouseMoveEvent(QMouseEvent * e)
{
if (!_mouseDown)
{
QTreeView::mouseMoveEvent(e) ;
return ;
}
if (QLineF(e->pos(), _clickPoint).length() < QApplication::startDragDistance())
{
QTreeView::mouseMoveEvent(e) ;
return;
}
QDrag *drag = new QDrag(this) ;
if (drag == NULL) return ;
QMimeData *mime = new QMimeData ;
if (mime == NULL) return ;
drag->setMimeData(mime) ;
mime->setText(QString("Temp/%1").arg(_activeItem));
// note to the unwary !! THIS BLOCKS!
drag->exec() ;
QTreeView::mouseMoveEvent(e) ;
}
void DragAndDropTreeView::mouseReleaseEvent(QMouseEvent * e)
{
_mouseDown = false ;
QTreeView::mouseReleaseEvent(e) ;
}
// this is called properly before any drag event - but not after.
void DragAndDropTreeView::ItemEntered(const QModelIndex & index)
{
_displayingShadow = true ;
}
int main(int argc, char * argv[])
{
QApplication app(argc,argv);
DragAndDropTreeView * DDTV = new DragAndDropTreeView(NULL) ;
// set up the model to accept data.
QStandardItemModel * _model = new QStandardItemModel(0, 1) ;
// slap some stuff in.
_model->setHeaderData(0, Qt::Horizontal, QObject::tr("Number"));
for (int i = 0 ; i < 10 ; i++)
{
_model->insertRow(i);
_model->setData(_model->index(i, 0), QString("%1").arg(i));
}
// show all the beauty of it
DDTV->setRootIsDecorated(false) ;
DDTV->setModel(_model) ;
DDTV->setDragEnabled(true) ;
DDTV->setSortingEnabled(true) ;
DDTV->setSelectionMode(QAbstractItemView::SingleSelection) ;
DDTV->show() ;
return app.exec();
}
To copy to clipboard, switch view to plain text mode
Bookmarks