在内部使用ComboBox拖动ListWidget项目



我在图标模式下有两个列表widgets list1是100个小部件项目的列表(每个小部件项目都是一个包装有连击的图标,其中包含3-4个项目(。这些ComboBox项目是图标的数据,这将永远不会更改,它们包含了小部件项目,ListWidget2是空的,我只想能够从1中拖动小部件项目(图标和combobox,带有项目(并制作一个喜欢的列表使用List1的一些小部件,将任何变化都不会更改为组合项目或List1的小部件项目,它们将始终具有相同的数据,问题在于,每次我拖动小部件时,图标仅复制到另一个ListWidget。

 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());
 }

如果要移动ComboBox,则必须覆盖DropeVent方法,因此必须创建一个从QlistWidget继承的类,获取小部件并复制必要的数据。如果您想在QT设计师中使用它。

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);
}

在以下链接中有一个示例。

相关内容

  • 没有找到相关文章

最新更新