首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何查找拖动已启动QTableView的行

如何查找拖动已启动QTableView的行
EN

Stack Overflow用户
提问于 2015-01-05 12:22:21
回答 2查看 261关注 0票数 1

我在QTableView上工作,我想在它上实现拖放。我想要的方式是:当我拖动时,我想要拖出要拖动的行,并在那里放置一个空的占位符,这是我重新实现dragEnterEvent的方式:

代码语言:javascript
运行
复制
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() );

并不总是返回正确的值。

EN

Stack Overflow用户

发布于 2015-01-05 13:56:53

我最终重现了这个问题,我也得到了不正确的值(拖动到非常接近2行的连接区)。所以我用下一个事件过滤器解决了这个问题:

代码语言:javascript
运行
复制
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,您还应该:

代码语言:javascript
运行
复制
protected:
    bool eventFilter(QObject *obj, QEvent *event);//in header

代码语言:javascript
运行
复制
qApp->installEventFilter(this);//in constructor
票数 1
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27773385

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档