【问题标题】:Extend mousePressEvent() for dragging but retain previous behaviour for clicking扩展 mousePressEvent() 以进行拖动,但保留以前的单击行为
【发布时间】:2013-11-07 14:12:38
【问题描述】:

我正在尝试将拖放功能添加到 QListWidget。使用以下代码达到了第一个里程碑。

//draglist.h
#include <QListWidget>

class SourceList : public QListWidget
{
public:
    SourceList(QWidget * parent = 0);
protected:
    void mousePressEvent(QMouseEvent *event);
};
//draglist.cpp
#include "draglists.h"
#include <QMouseEvent>
#include <QDebug>
#include <QMimeData>
#include <QDrag>

SourceList::SourceList(QWidget * parent)
    :QListWidget(parent)
{
}

void SourceList::mousePressEvent(QMouseEvent *event)
{
    //Data from the selected QListWidgetItem
    QString itemData = currentItem()->data(Qt::DisplayRole).toString();

    QMimeData *mimeData = new QMimeData;
    mimeData->setText(itemData);

    QDrag *drag = new QDrag(this);
    drag->setMimeData(mimeData);
    drag->exec();
}

它启用了列表项的拖动功能,但不能再单击它们。 如何保留单击左键选择列表中项目的功能(这是mousePressEvent() 未被覆盖时的行为)?

可能的解决方案

检查原始QAbstractItemView::mousePressEvent(QMouseEvent *event) 的源代码并将所需的代码重新复制到SourceList::mousePressEvent(QMouseEvent *event) 实现中。如果有的话,我正在寻找替代方案。

【问题讨论】:

    标签: qt drag-and-drop overriding


    【解决方案1】:

    要保留默认功能,您可以将事件向上传播到父类:

    void SourceList::mousePressEvent(QMouseEvent *event)
    {
        // Your handling of mouse event.
        [..]
        QListWidget::mousePressEvent(event);    
    }
    

    如果您需要处理鼠标左键按下,您可以使用QMouseEvent::button() 函数并将返回值与一个或多个Qt::MouseButton 值进行比较。例如:

    if (event->button() & Qt::LeftButton) {
        // Handle the left mouse button click.
    }
    

    【讨论】:

      猜你喜欢
      • 2011-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-22
      • 1970-01-01
      相关资源
      最近更新 更多