悬浮球源码
1. 如何实现android炫酷悬浮球菜单
谷歌地图应该是没法实现离线地图导航的把,毕竟谷歌地图到现在也没出离线地图包下载,只是支持区域地图下载缓存,导航的话,离线导航的话肯定要下载大范围的地图才行啊。 在一点,说下离线导航,离线导航也就意味这你要讲所有的导航数据存储到你手机本机,然后使用GPS来实现。但这有个问题,离线导航的数据肯定是很大的(我知道的离线地图包最小的老虎地图全国离线地图包也要208兆呢,这还是压缩包的大小),还有各种分类信息数据,这就要求你手机有很大的内存才行,但这对于手机而言并不划算的,毕竟用手机导航的次数应该不多的--如果你天天用那么建议你购买专门的导航仪吧,智能手机开启GPS以及屏幕常量是非常耗电的,Android手机更甚。 以上我建议你还是放弃离线地图导航的想法吧。下载个其他的手机地图软件,比如我上面说的老虎地图,离线地图包小,而且定位使用流量耗费也不大的。还有使用离线地图+在线服务这种模式的手机地图每次查询都是最新的数据,毕竟你出行、无论公交、或者大楼大厦、餐厅之类的都可能有变动,这也是使用在线服务的一大优势。这方面个人感觉老虎地图做的也不错,信息也比较全面了。 就是老虎地图的导航不怎么样,不过也基本能用,呵呵,以上你可以给你的客户讲嘛,不用客户说什么就说什么,你说可以留着最大的存储存歌曲啊、存视频之类的,比导航有更适用。还有要强调他买的是手机,不是导航仪。对了,老虎地图说是可以离线定位,就是说没有网络的情况下,在空旷的地方可以GPS定位--不在空旷的地方没有GPS信号的 以上希望我的回答可帮助到你!!
2. qt鼠标悬浮拖拽
1. 首先,需要设置自己的控件是支持拖放操作的,按照如下设置即可:
setDragEnabled(true); //允许拖拽
setAcceptDrops(true); //允许放置
登录后复制
2. 其次,我这个拖放操作是基于QTreeView来完成的,因此继承这个QTeeView之后还需要实现startDrag()这个函数。它可以被理解成是拖放操作的入口函数。
//开始拖拽事件
virtual void stratDrag(Qt::DropActions supportedAxtions);
//这个函数可以理解为拖放操作的入口函数。当拖放开始进行时,就会发现断点会进到这里。
void CMyTree::stratDrag(Qt::DropActions supportedAxtions)
{
QDrag* pDrag = new QDrag(this);
QMimeData* pMimeData = new QMimeData;
QModelIndex index = currentIndex();
if (pDrag && pMimeData)
{
pDrag->setMimeData(pMimeData);
pDrag->exec(Qt::MoveAction);
}
}
登录后复制
3. 接下来,拖放操作肯定是离不开鼠标的按压与移动的。因此还需要实现以下几个虚函数。
//鼠标点击事件
virtual void mousePressEvent(QMouseEvent *event);
//拖拽进入事件
virtual void dragEnterEvent(QDragEnterEvent* event);
//拖拽移动事件
virtual void dragMoveEvent(QDragMoveEvent* event);
//拖放事件
virtual void dropEvent(QDropEvent *event);
//鼠标松开事件
virtual void mouseReleaseEvent(QMouseEvent *event);
//鼠标移动事件
virtual void mouseMoveEvent(QMouseEvent *event);
//鼠标悬停事件
virtual bool viewportEvent(QEvent *event);
登录后复制
当一切准备工作完成后,再通过QTreeView与QStandardItemModel相结合,完成一些列的拖放操作。本例大致需求是:将叶子节点拖放到不同组织下。整个源码如下:
//CMyTree.h
#pragma once
#include <QTreeView>
#include <QStandardItem>
class CMyTree :
public QTreeView
{
public:
CMyTree(QWidget* parent = nullptr);
protected:
//开始拖拽事件
virtual void stratDrag(Qt::DropActions supportedAxtions);
//鼠标点击事件
virtual void mousePressEvent(QMouseEvent *event);
//拖拽进入事件
virtual void dragEnterEvent(QDragEnterEvent* event);
//拖拽移动事件
virtual void dragMoveEvent(QDragMoveEvent* event);
//拖放事件
virtual void dropEvent(QDropEvent *event);
//鼠标松开事件
virtual void mouseReleaseEvent(QMouseEvent *event);
//鼠标移动事件
virtual void mouseMoveEvent(QMouseEvent *event);
//鼠标悬停事件
virtual bool viewportEvent(QEvent *event);
private:
QStandardItem* m_pDragItem;
QStandardItem* m_pDropItem;
};
登录后复制
//CMyTree.cpp
#include "CMyTree.h"
#include <QDrag>
#include <QMimeData>
#include <QStandardItemModel>
#include <QMouseEvent>
CMyTree::CMyTree(QWidget* parent /* = nullptr */)
: QTreeView(parent)
, m_pDragItem(nullptr)
, m_pDropItem(nullptr)
{
setDropIndicatorShown(true);
setHeaderHidden(true); //隐藏表头
setDragEnabled(true); //允许拖拽
setAcceptDrops(true); //允许放置
}
void CMyTree::stratDrag(Qt::DropActions supportedAxtions)
{
QDrag* pDrag = new QDrag(this);
QMimeData* pMimeData = new QMimeData;
QModelIndex index = currentIndex();
if (pDrag && pMimeData)
{
pDrag->setMimeData(pMimeData);
pDrag->exec(Qt::MoveAction);
}
}
void CMyTree::mousePressEvent(QMouseEvent *event)
{
if (Qt::RightButton == event->button())
{
setDragEnabled(false);
}
else if (Qt::LeftButton == event->button())
{
setDragEnabled(true);
}
QTreeView::mousePressEvent(event);
}
void CMyTree::dragEnterEvent(QDragEnterEvent* event)
{
if (event->mimeData())
{
QStandardItemModel* pModel = (QStandardItemModel*)(this->model());
QPoint mousePos = event->pos();
QModelIndex localIndex = indexAt(mousePos);
m_pDragItem = pModel->itemFromIndex(localIndex);
QString strData = localIndex.data(Qt::DisplayRole).toString();
QRect rect = visualRect(localIndex);
event->accept();
}
}
void CMyTree::dragMoveEvent(QDragMoveEvent* event)
{
if (event->mimeData())
{
update();
event->accept();
}
}
void CMyTree::dropEvent(QDropEvent *event)
{
QStandardItemModel* pModel = (QStandardItemModel*)(this->model());
QPoint mousePos = event->pos();
QModelIndex localIndex = indexAt(mousePos);
m_pDropItem = pModel->itemFromIndex(localIndex);
QString strData = localIndex.data(Qt::DisplayRole).toString();
QRect rect = visualRect(localIndex);
//同组织下释放没效果
QStandardItem* pDragItemParent = m_pDragItem->parent();
QStandardItem* pDropItemParent = m_pDropItem->parent();
if (pDragItemParent == pDropItemParent)
{
return;
}
else if (pDragItemParent && pDropItemParent)
{
QStandardItem* pItem = new QStandardItem(m_pDragItem->data(Qt::DisplayRole).toString());
pDropItemParent->appendRow(pItem);
}
update();
}
void CMyTree::mouseReleaseEvent(QMouseEvent *event)
{
QTreeView::mouseReleaseEvent(event);
}
void CMyTree::mouseMoveEvent(QMouseEvent *event)
{
QTreeView::mouseMoveEvent(event);
}
bool CMyTree::viewportEvent(QEvent *event)
{
return QTreeView::viewportEvent(event);
}
登录后复制
//CMyApp.h
#pragma once
#include <QtWidgets/QWidget>
#include <QStandardItemModel>
#include "ui_CMyApp.h"
class CMyApp : public QWidget
{
Q_OBJECT
public:
CMyApp(QWidget *parent = Q_NULLPTR);
void InitUI();
private:
Ui::CMyAppClass ui;
QStandardItemModel* m_pModel;
};
登录后复制
//CMyApp.cpp
#include "CMyApp.h"
#include <QStandardItem>
CMyApp::CMyApp(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this);
m_pModel = new QStandardItemModel(ui.treeView);
InitUI();
}
void CMyApp::InitUI()
{
QStandardItem* pItem1 = new QStandardItem(QStringLiteral("法师"));
m_pModel->appendRow(pItem1);
QStandardItem* pItem1_1 = new QStandardItem(QStringLiteral("妲己"));
QStandardItem* pItem1_2 = new QStandardItem(QStringLiteral("小乔"));
QStandardItem* pItem1_3 = new QStandardItem(QStringLiteral("西施"));
pItem1->appendRow(pItem1_1);
pItem1->appendRow(pItem1_2);
pItem1->appendRow(pItem1_3);
QStandardItem* pItem2 = new QStandardItem(QStringLiteral("法刺"));
m_pModel->appendRow(pItem2);
QStandardItem* pItem2_1 = new QStandardItem(QStringLiteral("不知火舞"));
QStandardItem* pItem2_2 = new QStandardItem(QStringLiteral("貂蝉"));
QStandardItem* pItem2_3 = new QStandardItem(QStringLiteral("上官婉儿"));
pItem2->appendRow(pItem2_1);
pItem2->appendRow(pItem2_2);
pItem2->appendRow(pItem2_3);
ui.treeView->setModel(m_pModel);
}
登录后复制
//main.cpp
#include "CMyApp.h"
#include <QtWidgets/QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
CMyApp w;
w.show();
return a.exec();
}