Qt实现可拖动按钮
本文实例为大家分享了Qt实现可拖动按钮的具体代码,供大家参考,具体内容如下
直接上代码
self-contained.h
#ifndefSELFCONTAINED_H #defineSELFCONTAINED_H #include#include #include #include #include #include #endif//SELFCONTAINED_H
按钮控件
drawbutton.h:
#ifndefDRAGBUTTON_H
#defineDRAGBUTTON_H
#include"self-contained.h"
classDragButton:publicQWidget
{
Q_OBJECT
public:
DragButton(QWidget*parent=0);
voidsetInitialScaling(doublescaling);
voidsetPixmap(QStringpixmap);
voidsetText(QStringstr);
voidsetIsHold(boolflag);
protected:
intisPress;
intisHold;
QTimer*m_aniTimer;
QTimer*m_holdTimer;
doublem_scaling;
doublem_InitialScaling;//当前缩放比例
QPointm_mouseSrcPos;//最小缩放比例
QPixmapm_pixmap;
QStringm_text;
voidpaintEvent(QPaintEvent*);
voidenterEvent(QEvent*);
voidleaveEvent(QEvent*);
voidmousePressEvent(QMouseEvent*);
voidmouseReleaseEvent(QMouseEvent*);
voidmouseMoveEvent(QMouseEvent*);
signals:
voidrelease_signal();
voiddrag_signal();//拖动时发出信号
voidclicked();
publicslots:
voidzoomIn();//放大
voidzoomOut();//缩小
voidhold_slot();
};
#endif//DRAGBUTTON_H
drawbutton.cpp
#include"dragbutton.h"
DragButton::DragButton(QWidget*parent):
QWidget(parent),isPress(0),isHold(0),m_scaling(0.5),m_InitialScaling(0.5),m_mouseSrcPos(0,0)
{
m_aniTimer=newQTimer(this);
m_aniTimer->setInterval(7);
m_holdTimer=newQTimer(this);
m_holdTimer->setInterval(1000);
m_holdTimer->setSingleShot(true);
connect(m_holdTimer,SIGNAL(timeout()),this,SLOT(hold_slot()));
}
voidDragButton::setInitialScaling(doublescaling)
{
if(scaling<=1&&scaling>0)
{
m_InitialScaling=scaling;
m_scaling=scaling;
}
}
voidDragButton::setPixmap(QStringpixmap)
{
m_pixmap.load(pixmap);
update();
}
voidDragButton::setText(QStringstr)
{
m_text=str;
update();
}
voidDragButton::setIsHold(boolflag)
{
isHold=flag;
update();
}
voidDragButton::paintEvent(QPaintEvent*)
{
if(m_pixmap.isNull())
return;
QPainterpainter(this);
painter.setRenderHint(QPainter::Antialiasing);
if(isPress)
{
painter.setPen(Qt::NoPen);
painter.setBrush(QColor(0,0,0,130));
painter.drawRoundedRect(rect(),20,20);
}
m_pixmap=m_pixmap.scaled(width(),height()-20,Qt::KeepAspectRatio,Qt::SmoothTransformation);
intw=m_pixmap.width()*m_scaling;
inth=m_pixmap.height()*m_scaling;
painter.drawPixmap(QRect((width()-w)/2,(height()-h)/2-20,w,h),
m_pixmap,m_pixmap.rect());
painter.setPen(QColor(0,0,0));
painter.drawText(QRect(0,height()-40,width(),40),Qt::AlignCenter,m_text);
}
voidDragButton::enterEvent(QEvent*)
{
disconnect(m_aniTimer,SIGNAL(timeout()),this,SLOT(zoomOut()));
connect(m_aniTimer,SIGNAL(timeout()),this,SLOT(zoomIn()));
m_aniTimer->start();
}
voidDragButton::leaveEvent(QEvent*)
{
disconnect(m_aniTimer,SIGNAL(timeout()),this,SLOT(zoomIn()));
connect(m_aniTimer,SIGNAL(timeout()),this,SLOT(zoomOut()));
m_aniTimer->start();
}
voidDragButton::mousePressEvent(QMouseEvent*e)
{
if(!isHold)
isPress=1;
m_holdTimer->start();
m_mouseSrcPos=e->pos();
update();
}
voidDragButton::mouseReleaseEvent(QMouseEvent*e)
{
m_holdTimer->stop();
isPress=0;
isHold=0;
if(rect().contains(e->pos()))
emitclicked();
emitrelease_signal();
update();
}
voidDragButton::mouseMoveEvent(QMouseEvent*e)
{
if(isHold)
{
move(pos()-m_mouseSrcPos+e->pos());
emitdrag_signal();
}
else
m_mouseSrcPos=e->pos();
}
voidDragButton::zoomIn()
{
m_scaling+=0.01;
if(m_scaling>=1)
{
m_scaling=1;
m_aniTimer->stop();
}
update();
}
voidDragButton::zoomOut()
{
m_scaling-=0.01;
if(m_scaling<=m_InitialScaling)
{
m_scaling=m_InitialScaling;
m_aniTimer->stop();
}
update();
}
voidDragButton::hold_slot()
{
isHold=1;
isPress=0;
m_aniTimer->stop();
m_scaling=m_InitialScaling;
update();
}
整合按钮的控件
drawwidget.h
#include"dragbutton.h"
classDragWidget:publicQWidget
{
Q_OBJECT
public:
DragWidget(QWidget*parent=0);
~DragWidget();
voidaddButton(DragButton*);
protected:
QVectorBtnVector;
QPointm_mouseSrcPos;//记录坐标点
voidresetInterface();//复位
signals:
publicslots:
voidBtnMove_slots();
voidBtnRelease_slots();
};
#endif//DRAGWIDGET_H
drawwidget.cpp
#include"dragwidget.h"
DragWidget::DragWidget(QWidget*parent)
:QWidget(parent),m_mouseSrcPos(0,0)
{
}
DragWidget::~DragWidget()
{
}
voidDragWidget::addButton(DragButton*btn)
{
connect(btn,SIGNAL(drag_signal()),this,SLOT(BtnMove_slots()));
connect(btn,SIGNAL(release_signal()),this,SLOT(BtnRelease_slots()));
BtnVector.push_back(btn);
btn->show();
resetInterface();
}
voidDragWidget::resetInterface()
{
for(inti=0;isetGeometry(i*width()/BtnVector.length(),0,width()/BtnVector.length(),height());
}
}
voidDragWidget::BtnMove_slots()
{
for(inti=0;ipos().x()+BtnVector[i]->width()/2)/(width()/BtnVector.length());
for(intl=0;lsetGeometry(l*width()/BtnVector.length(),0,width()/BtnVector.length(),height());
elseif((l>i&&l<=flag)||(l>=flag&&lsetGeometry((l+((i-flag)>0?1:-1))*width()/BtnVector.length(),0,width()/BtnVector.length(),height());
elseif(l>flag&&l>i)
BtnVector[l]->setGeometry(l*width()/BtnVector.length(),0,width()/BtnVector.length(),height());
}
//注释部分合为上面的循环
//if(flag>=i)//往后拖
//for(intl=0;lsetGeometry(l*width()/BtnVector.length(),0,width()/BtnVector.length(),height());
//elseif(l>i&&l<=flag)
//BtnVector[l]->setGeometry((l-1)*width()/BtnVector.length(),0,width()/BtnVector.length(),height());
//elseif(l>flag)
//BtnVector[l]->setGeometry(l*width()/BtnVector.length(),0,width()/BtnVector.length(),height());
//}
//elseif(flagsetGeometry(l*width()/BtnVector.length(),0,width()/BtnVector.length(),height());
//elseif(l>=flag&&lsetGeometry((l+1)*width()/BtnVector.length(),0,width()/BtnVector.length(),height());
//elseif(l>i)
//BtnVector[l]->setGeometry(l*width()/BtnVector.length(),0,width()/BtnVector.length(),height());
//}
break;
}
}
voidDragWidget::BtnRelease_slots()
{
for(inti=0;ipos().x();
if(posX<0)
posX=0;
elseif(posX>width())
posX=width();
intflag=(posX+BtnVector[i]->width()/2)/(width()/BtnVector.length());
DragButton*btn=BtnVector[i];//修改vector顺序
if(flag>=i)
for(intl=i;lflag;--l)
BtnVector[l]=BtnVector[l-1];
BtnVector[flag]=btn;
}
resetInterface();//复位
}
使用
main.cpp
#include"dragwidget.h" #includeintmain(intargc,char*argv[]) { QApplicationa(argc,argv); DragWidgetww; ww.setGeometry(200,200,800,200); DragButtonw(&ww); w.setPixmap(":/image/image/contacts.png"); w.setText("按钮1"); w.setInitialScaling(0.6); DragButtonw2(&ww); w2.setPixmap(":/image/image/time.png"); w2.setText("按钮2"); w2.setInitialScaling(0.6); DragButtonw3(&ww); w3.setPixmap(":/image/image/checking.png"); w3.setText("按钮3"); w3.setInitialScaling(0.6); DragButtonw4(&ww); w4.setPixmap(":/image/image/suitcase.png"); w4.setText("按钮4"); w4.setInitialScaling(0.6); ww.addButton(&w); ww.addButton(&w2); ww.addButton(&w3); ww.addButton(&w4); ww.show(); returna.exec(); }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。