c++ - QTableView如何找到拖动开始的行

标签 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->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/

相关文章:

c++ - 一个大工厂类如何模块化?

qt - QGraphicsObject 上的 deleteLater 与 removeItem

javascript - 将对象(几乎)拖到窗口外时,如何使窗口自动向该方向滚动?

c++ - 圆形检测-可靠性评估

C++:使用 LB_GETCURSEL 和 LB_GETTEXT 从列表框中获取信息

c++ - QMake附加到DEFINE而不考虑条件

c++ - Qt中的一个新手问题

c++ - 如何在 Qt 中更改窗口的标题?

javascript - 如何将 Gridster 与 div(不是 ul)一起使用

javascript - 在 AngularJS : make a directive that is a drop zone, 中拖放,在拖动时显示叠加层