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;i pos().x()+BtnVector[i]->width()/2)/(width()/BtnVector.length()); for(intl=0;l setGeometry(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;l setGeometry(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;i pos().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;l flag;--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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。