1. 环境
Qt 5.12 +VS2015 community
2. 效果
QWidget部件上拖动直线,达到类似扫描的效果
3.主要代码
主要是要重载几个事件,如鼠标事件和拖动事件等,可以参考到QT官方例程DraggableIcons。
Widget::Widget(QWidget *parent): QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
setAcceptDrops(true);
mPixmap = QSharedPointer<QPixmap> (new QPixmap(width(), 2));
mPixmap->fill(Qt::red);
m_pHLine = new QFrame(this);
m_pHLine->setMinimumWidth(width());
m_pHLine->setFrameStyle(QFrame::HLine | QFrame::Plain);
m_pHLine->setAttribute(Qt::WA_DeleteOnClose);
}
Widget::~Widget()
{
delete ui;
}
void Widget::resizeEvent(QResizeEvent *event)
{
Q_UNUSED(event);
mPixmap.reset(new QPixmap(event->size().width(), 2));
mPixmap->fill(Qt::red);
}
void Widget::dragEnterEvent(QDragEnterEvent *event)
{
if (event->source() == this) {
event->setDropAction(Qt::MoveAction);
event->accept();
} else {
event->acceptProposedAction();
}
}
void Widget::dragMoveEvent(QDragMoveEvent *event)
{
if (event->source() == this) {
event->setDropAction(Qt::MoveAction);
event->accept();
} else {
event->acceptProposedAction();
}
}
void Widget::dropEvent(QDropEvent *event)
{
QFrame * hline = new QFrame(this);
hline->setMinimumWidth(width());
hline->setFrameStyle(QFrame::HLine | QFrame::Plain);
hline->setAttribute(Qt::WA_DeleteOnClose);
hline->move(0.0, event->pos().y() );
hline->show();
if (event->source() == this) {
event->setDropAction(Qt::MoveAction);
event->accept();
} else {
event->acceptProposedAction();
}
}
void Widget::mousePressEvent(QMouseEvent *event)
{
QFrame *child = static_cast<QFrame*>(childAt(event->pos()));
if (!child)
return;
QDrag *drag = new QDrag(this);
drag->setMimeData( new QMimeData()); /// 必须设置MimeData才能实现拖动的效果,哪怕是个空的
drag->setPixmap(*mPixmap.data());
drag->setHotSpot(event->pos() - child->pos());
if (drag->exec(Qt::CopyAction | Qt::MoveAction, Qt::CopyAction) == Qt::MoveAction) {
child->close();
}
}