【问题标题】:How to find the row from which drag has started QTableViewQTableView如何找到开始拖动的行
【发布时间】: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


【解决方案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

【讨论】:

    【解决方案2】:

    我最终覆盖了“mousePressEvent”并将开始位置保存在那里。 我在“dragEnterEvent”中使用相同的保存位置。 这个非常适合我。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-24
      • 2020-08-06
      • 1970-01-01
      相关资源
      最近更新 更多