2

我有一个带有简单文本行的 QListWidget。我想设置它,以便用户可以将此数据拖放到一些 QLineEdit 对象中。

我已经为这两种类型打开了拖放功能,但它不允许我从 QListWidget 拖放到 QLineEdit。但是,它确实允许我从一个 QLineEdit 拖动到另一个 QLineEdit。

到目前为止,我没有重新实现任何方法。我所做的只是在编辑视图中打开拖放功能。

如何启用从 QListWidget 到 QLineEdit 的拖放功能?我需要重新实现哪些方法?

谢谢,

4

3 回答 3

3

我想到了。

供参考:

您需要继承 QLineEdit 并重新实现 dragEnterEvent 和 dropEvent。

void MyLineEdit::dragEnterEvent(QDragEnterEvent *e){
    if(e->mimeData()->hasFormat("application/x-qabstractitemmodeldatalist")){
        e->acceptProposedAction();
    }
}

void MyLineEdit::dropEvent(QDropEvent *e){
    QByteArray encoded = e->mimeData()->data("application/x-qabstractitemmodeldatalist");
    QDataStream strm(&encoded, QIODevice::ReadOnly);
    while(!strm.atEnd()){
        int row, col;
        QMap<int,  QVariant> data;
        strm >> row >> col >> data;
        this->setText(data[0].toString());
    }
}
于 2013-07-18T06:27:54.767 回答
2

由于您试图从不同类型的 dnd 中拖动不同的 mime 数据。因此 QLineEdit 不知道如何处理被丢弃的数据。子类化您的小部件并实现 dropEvent(),最终您还需要 dragEnterEvent()、dragLeaveEvent() 和 dragMoveEvent()。

于 2013-07-18T05:30:58.333 回答
0

为了答案的完整性:您需要将 QLineEdit 子类化(创建 MyLineEdit 类,它继承自 QLineEdit),并将 QLineEdit 的用法替换为 MyLineEdit(通常在 xxxx.ui 文件中):

创建文件:MyLineEdit.h:

#include <QLineEdit>
 
 
class MyLineEdit : public QLineEdit
{
 
public:
  MyLineEdit(QWidget *parent = 0);
  ~MyLineEdit();
  void dragEnterEvent(QDragEnterEvent *e);
  void dragMoveEvent(QDragMoveEvent *e);
  void dropEvent(QDropEvent *e);
};
 

创建文件:MyLineEdit.cpp:

#include "MyLineEdit.h"
#include <QDragMoveEvent>
#include <QDropEvent>
#include <QUrl>
#include <QFileInfo>
 
 
MyLineEdit::MyLineEdit(QWidget *parent)
 : QLineEdit(parent)
{}
 
MyLineEdit::~MyLineEdit()
{}
 
void MyLineEdit::dragEnterEvent(QDragEnterEvent *e){
    if (e->mimeData()->hasUrls()) {
        e->acceptProposedAction();
    }
}
 
void MyLineEdit::dragMoveEvent(QDragMoveEvent *e){
    if (e->mimeData()->hasUrls()) {
        e->acceptProposedAction();
    }
}
 
void MyLineEdit::dropEvent(QDropEvent *event){
    const QMimeData* mimeData = event->mimeData();
 
    if (mimeData->hasUrls())
    {
        QStringList pathList;
        QList<QUrl> urlList = mimeData->urls();
 
        for (int i = 0; i < urlList.size() && i < 32; ++i)
        {
            QString str = urlList.at(i).toLocalFile();
            if (!str.isEmpty())
            {
                // support txt/csv files only
                QString suffix = QFileInfo(str).suffix();
                if (suffix == "txt" || suffix == "csv")  // place here whatever suffix you want
                {
                    // action - set the file path field to the name of the dropped file
                    this->setText(str);
                    event->acceptProposedAction();
                    break;
                }
            }
        }
    }
}

    

并更改用法,例如,从此:

<widget class="QLineEdit" name="lineEdit_xxxx">

对此:

<widget class="MyLineEdit" name="lineEdit_xxxx">
于 2021-10-07T18:23:34.253 回答