0

我正在尝试将拖放功能添加到 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)。我正在寻找替代方案,如果存在的话。

4

1 回答 1

2

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

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.
}
于 2013-11-07T14:22:26.093 回答