Qt小例子学习49 - 在combobox内部拖放listwidget
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 <QComboBox>
#include <QDropEvent>
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);
}
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QComboBox>
#include <QDir>
#include <QDirIterator>
#include <QFileInfoList>
#include <QListWidget>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent), ui(new Ui::MainWindow)
{
ui->setupUi(this);
QDir dir(":/icons");
QFileInfoList fileInfoList =
dir.entryInfoList(QDir::AllEntries | QDir::Dirs | QDir::NoDotAndDotDot);
for (const QFileInfo &finfo : fileInfoList)
{
QIcon icon;
icon.addFile(finfo.absoluteFilePath(), QSize(), QIcon::Normal, QIcon::Off);
QListWidgetItem *item = new QListWidgetItem;
item->setIcon(icon);
ui->listwidget1->insertItem(ui->listwidget1->count(), item);
QComboBox *box = new QComboBox;
box->addItems(QStringList{finfo.baseName(), "item1", "item2", "item3"});
ui->listwidget1->setItemWidget(item, box);
QSize size = item->sizeHint();
size.setHeight(box->sizeHint().height());
item->setSizeHint(size);
}
}
MainWindow::~MainWindow() { delete ui; }
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
namespace Ui
{
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
main.cpp
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}