我正在研究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() );
并不总是返回正确的值。
最佳答案
我终于重现了问题,我也得到了不正确的值(拖动到非常靠近 2 行的连接区域)。所以我用下一个事件过滤器解决了这个问题:
ui->tableView->setDragEnabled(true);//somewhere in constructor
ui->tableView->setAcceptDrops(true);
//...
bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{
if (obj == ui->tableView->viewport() && event->type() == QEvent::DragEnter)
{
QDragEnterEvent * e = static_cast<QDragEnterEvent *>(event);
qDebug( ) << ui->tableView->rowAt(e->pos().y());
}
return QObject::eventFilter(obj, event);
}
要使用 eventFilter
,您还应该:
protected:
bool eventFilter(QObject *obj, QEvent *event);//in header
和
qApp->installEventFilter(this);//in constructor
关于c++ - QTableView如何找到拖动开始的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27773385/