【问题标题】:Drag and drop listwidget items with a combobox inside拖放带有组合框的列表小部件项目
【发布时间】:2018-02-11 08:48:34
【问题描述】:

我有两个处于图标模式的列表小部件 list1 是一个包含 100 个小部件项目的列表(每个小部件项目都是一个图标,里面有一个包含 3-4 个项目的组合框)。 那些组合框项目是永远不会改变的图标的数据,它们与小部件项目打包在一起,listwidget2 是空的,我只想能够从 1 拖动小部件项目(图标和带有项目的组合框)并制作一个收藏列表对于 list1 的某些小部件,组合框项目或 list1 的小部件项目不会发生任何变化,它们将始终具有相同的数据, 问题是每次我拖动小部件时,只会将图标复制到另一个列表小部件。

 QDir dir ("icons");
 QFileInfoList list = dir.entryInfoList(QDir::AllEntries | 
 QDir::Dirs|QDir::NoDotAndDotDot);

 for(int i=0 ; i < list.length() ; i++){
 dir_names.push_back(list.at(i).baseName());
 /*Setting the icon*/
 QIcon icon;
 icon.addFile(list.at(i).absoluteFilePath(), QSize(), QIcon::Normal, 
 QIcon::Off);
 QListWidgetItem *iconItem = new QListWidgetItem(ui->listWidget);
 iconItem->setIcon(icon);

 QComboBox *box = new QComboBox;
 QListWidgetItem *textItem = ui->listWidget->item(i);

 ui->listWidget->setItemWidget( textItem,box);
 box->setFixedHeight(18);
 box->addItem(list.at(i).baseName());
 }

【问题讨论】:

    标签: c++ qt qt5 qcombobox qlistwidget


    【解决方案1】:

    如果您想移动组合框,您必须覆盖 dropEvent 方法,因此您必须创建一个继承自 QListWidget 的类,获取小部件并复制必要的数据。如果你想在 Qt Designer 中使用它,你必须promote it

    listwidget.h

    #ifndef LISTWIDGET_H
    #define LISTWIDGET_H
    
    #include <QListWidget>
    
    class ListWidget : public QListWidget
    {
        Q_OBJECT
    public:
        ListWidget(QWidget * parent = 0);
        void dropEvent(QDropEvent * event);
    
    protected:
        void mouseMoveEvent(QMouseEvent * event);
    };
    
    #endif // LISTWIDGET_H
    

    listwidget.cpp

    #include "listwidget.h"
    
    #include <QDropEvent>
    #include <QComboBox>
    
    ListWidget::ListWidget(QWidget *parent):QListWidget(parent)
    {
        setDragEnabled(true);
        setAcceptDrops(true);
        setDropIndicatorShown(true);
        setDefaultDropAction(Qt::MoveAction);
    }
    
    void ListWidget::dropEvent(QDropEvent *event)
    {
        if(event->dropAction() == Qt::MoveAction && event->source()){
            ListWidget *listWidget = qobject_cast<ListWidget *>(event->source());
            if(!listWidget)
                return;
    
            QList<QPersistentModelIndex> pIndexes;
            for(QModelIndex index: listWidget->selectedIndexes()){
                pIndexes << QPersistentModelIndex(index);
            }
    
            std::sort(pIndexes.begin(), pIndexes.end());
    
            QListWidgetItem *item = itemAt(event->pos());
            int rowStart = item? row(item) : count();
    
            for(QPersistentModelIndex pindex: pIndexes){
                int r = QModelIndex(pindex).row();
                QComboBox *input = qobject_cast<QComboBox *>(listWidget->itemWidget(listWidget->item(r)));
    
                QComboBox *output;
                if(input){
                    // move data to QComboBox
                    output = new QComboBox;
                    for(int i=0; i<input->count(); i++){
                        output->addItem(input->itemText(i));
                        output->setCurrentText(input->currentText());
                    }
                }
    
                QListWidgetItem *it = listWidget->takeItem(r);
                insertItem(rowStart, it);
                if(input)
                    setItemWidget(it, output);
            }
            setState(QAbstractItemView::NoState);
        }
    }
    
    void ListWidget::mouseMoveEvent(QMouseEvent *event)
    {
        setState(QAbstractItemView::DraggingState);
        QListWidget::mouseMoveEvent(event);
    }
    

    下面link有一个例子。

    【讨论】:

    • eyllanesc 非常感谢它对我帮助很大的代码。它适用于移动项目,但不适用于复制。现在只是想弄清楚如何将项目从 list1 拖放到 list2 而不从 list1 中删除它。这是我遗漏的简单事情还是需要很多额外的东西代码?我认为这条线`listWidget->takeItem(r);`从list1中删除了项目
    猜你喜欢
    • 2020-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-28
    • 1970-01-01
    • 2018-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多