又到周末了,尝试实现一个图标拖拽的小程序;主要实现的功能有:
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