【发布时间】:2015-01-05 04:22:21
【问题描述】:
我正在研究 QTableView,我想在它上面实现拖放。 我想要的方式是: 当我拖动时,我想取出要拖动的行并在那里放置一个空的占位符,这就是我重新实现dragEnterEvent的方式:
void dragEnterEvent ( QDragEnterEvent * event )
{
if( event->source() == this )
{
// Get the row to be dragged
int mItemDraggedRowPosition = rowAt( event->pos().y() );
auto currentModel = model();
auto standardModel = boost::polymorphic_cast< QStandardItemModel *>( currentModel );
// Take out the dragged row
QList<QStandardItem *> mDraggedItem = standardModel->takeRow ( ( mItemDraggedRowPosition ) );
// Insert an empty row there
standardModel->insertRow( ( mItemDraggedRowPosition ), new QStandardItem() );
}
event->accept();
}
}
现在我在这里面临的问题是我得到的行号有时不正确。
我做得不对吗? 有没有其他方法可以找出开始拖动的行, 似乎是我想要得到它的方式:
int mItemDraggedRowPosition = rowAt(event->pos().y());
并不总是返回正确的值。
【问题讨论】:
-
是的,我错了,但现在我用事件过滤器尝试了你的代码,我所有的行号都是正确的。您说您想要
find out the row from which the drag was started,但是当用户输入要拖动的小部件时,dragEnterEvent 会向您显示事件。The QDragEnterEvent class provides an event which is sent to a widget when a drag and drop action enters it. -
再次感谢您投入时间,在大多数情况下,它对我来说也是正确的,但是当我进入非常接近 2 行的连接区域的拖动时,我最终将行我开始拖动(我使用调试消息来解决这个问题),您是否使用我的代码获得了正确的行号......?还有一种你知道的方法,我可以告诉Qt这是如果我拖动它的像素数,那么只有它才有资格进行拖动事件..?
-
我终于重现了问题并更新了我的答案。这正是我认为可以正常工作的代码。
标签: c++ qt drag-and-drop