如何找到拖动QTableView的行

时间:2015-01-05 04:22:21

标签: c++ qt drag-and-drop

我正在研究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-&gt; pos()。y());

始终不会返回正确的值。

2 个答案:

答案 0 :(得分:1)

我终于重现了问题,我也得到了不正确的值(拖得非常靠近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

答案 1 :(得分:1)

我终于完成了覆盖&#34; mousePressEvent&#34;并保存起始位置。 我在&#34; dragEnterEvent&#34;中使用相同的保存位置。 这个适合我。

void
PrePressView::TableWidget::mousePressEvent( QMouseEvent * inEvent )
{
    if ( inEvent->button() == Qt::LeftButton )
    {
        int rowToMove = rowAt( inEvent->y() );
    }
}