部件之间图标拖拽

本文介绍了一个使用Qt实现的图标拖拽小程序,具备图标在不同部件间拖动、切换大/小图标视图、批量选择及动态调整布局等功能。程序包括主窗口、分割器、控制器和数据结构、图标部件以及布局部件的设计。
摘要由CSDN通过智能技术生成

又到周末了,尝试实现一个图标拖拽的小程序;主要实现的功能有:

1.两个部件的图标拖动转移

2.可以切换图标查看模式,有大图标和小图标模式两种

3.可以删除图标,添加也应该不难,所以就没实现。

4.可以框选多个图标

5.改变部件大小可以自动重新布局图标

这里初始化左边有十几个图标,右边的部件是空的。

主窗口

class MainWindow:public QMainWindow
{
	Q_OBJECT
public:
	MainWindow(QWidget *parent = NULL);
	~MainWindow();

private:
	Splitter    *m_pSplitter;
	MainWidget   *m_pLeftWidget;
	MainWidget   *m_pRightWidget;
	QScrollArea  *m_pSplitterArea;
};

MainWindow::MainWindow( QWidget *parent /*= NULL*/ ):QMainWindow(parent)
{
	this->setWindowTitle("IconDemo");
	m_pSplitter = new Splitter(this);
	m_pLeftWidget = new MainWidget(this);
	m_pLeftWidget->init();
	m_pRightWidget = new MainWidget(this);

	QSize size = m_pRightWidget->size();
	m_pSplitterArea = new QScrollArea(this);
	m_pSplitterArea->setWidget(m_pSplitter);
	m_pSplitter->addWidget(m_pLeftWidget);
	m_pSplitter->addWidget(m_pRightWidget);
	m_pSplitter->setMinimumSize(QSize(700,700));
	m_pSplitterArea->setMinimumSize(QSize(700,600));

	m_pSplitter->setCollapsible(0,false);
	m_pSplitter->setCollapsible(1,false);

	this->setStyleSheet(" QFrame{background-image: url(:/DragIcon/Resources/51.jpg) }");

	this->setFixedSize(QSize(700,550));
	connect(m_pLeftWidget,SIGNAL(heightChangeSignal(int)),m_pSplitter,SLOT(heightChangeSlot(int  )));
	connect(m_pRightWidget,SIGNAL(heightChangeSignal(int)),m_pSplitter,SLOT(heightChangeSlot(int )));

}

MainWindow::~MainWindow()
{

}

分割器

自定义分割器主要是为了在调节的时候可以改变其高度
class Splitter:public QSplitter
{
	Q_OBJECT
public:
	Splitter(QWidget *parent = NULL);
	~Splitter();
protected slots:
	void heightChangeSlot(int height);
private:
};

Splitter::Splitter( QWidget *parent /*= NULL*/ ):QSplitter(parent)
{

}

Splitter::~Splitter()
{

}

void Splitter::heightChangeSlot( int height )
{
	this->setMinimumHeight(height);
}

控制器和数据结构

Controller主要用于控制数据结构,添加和删除图标等。这里还自定义了一个ItemMimeData用于拖拽图标
enum {BigIcon_Mode = 0, SmallIcon_Mode};
struct IconItemData
{
	QImage  image;
	QString name;
	int mode ;
	IconItemData()
	{
		mode = SmallIcon_Mode;
	}
};

class Controller:public QObject
{
	Q_OBJECT
public:
	Controller(QObject *parent = NULL);
	~Controller();
	void init();
	void addItem(IconItemData* pItem);
	void deleteItem(int index);
	void deleteItem(IconItemData* pItem);
	void changeIconMode(int mode);
	size_t getSize()
	{
		return m_IconDataVec.size();
	}

	IconItemData* getItem(int index);

protected:
	
private:
	vector<IconItemData*>  m_IconDataVec;
};


class ItemMimeData:public QMimeData
{
	Q_OBJECT
public:
	ItemMimeData():QMimeData()
	{
		m_pDragItemList = NULL;
	}

	~ItemMimeData()
	{
		if (m_pDragItemList)
		{
			delete m_pDragItemList;
		}
	}

	void SetDragDatas(QString mimeType , QList<IconItemData*> *pItemList)
	{
		m_format<<mimeType;
		m_pDragItemList = pItemList;
	}

	QStringList formats() const
	{
		return m_format;
	}

	const QList<IconItemData*>* DragItemData() const
	{
		return m_pDragItemList;
	}



protected:

	QVariant retrieveData(const QString &mimetype, QVariant::Type preferredType) const
	{
		if (mimetype == "ItemMimeData
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值