欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Qt實(shí)現(xiàn)可拖動(dòng)按鈕

 更新時(shí)間:2020年08月20日 13:23:23   作者:BIG_C_GOD  
這篇文章主要為大家詳細(xì)介紹了Qt實(shí)現(xiàn)可拖動(dòng)按鈕,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了Qt實(shí)現(xiàn)可拖動(dòng)按鈕的具體代碼,供大家參考,具體內(nèi)容如下

直接上代碼

self-contained.h

#ifndef SELFCONTAINED_H
#define SELFCONTAINED_H

#include <QWidget>
#include <QPainter>
#include <QTimer>
#include <QImage>
#include <QMouseEvent>
#include <QVector>

#endif // SELFCONTAINED_H

按鈕控件

drawbutton.h:

#ifndef DRAGBUTTON_H
#define DRAGBUTTON_H

#include "self-contained.h"

class DragButton : public QWidget
{
  Q_OBJECT
public:
  DragButton(QWidget *parent = 0);

  void setInitialScaling(double scaling);
  void setPixmap(QString pixmap);
  void setText(QString str);
  void setIsHold(bool flag);
protected:
  int isPress;
  int isHold;

  QTimer *m_aniTimer;
  QTimer *m_holdTimer;

  double m_scaling;
  double m_InitialScaling;//當(dāng)前縮放比例
  QPoint m_mouseSrcPos;//最小縮放比例

  QPixmap m_pixmap;
  QString m_text;

  void paintEvent(QPaintEvent *);
  void enterEvent(QEvent *);
  void leaveEvent(QEvent *);
  void mousePressEvent(QMouseEvent *);
  void mouseReleaseEvent(QMouseEvent *);
  void mouseMoveEvent(QMouseEvent *);

signals:
  void release_signal();
  void drag_signal();//拖動(dòng)時(shí)發(fā)出信號(hào)
  void clicked();
public slots:
  void zoomIn();//放大
  void zoomOut();//縮小
  void hold_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 = new QTimer(this);
  m_aniTimer->setInterval(7);

  m_holdTimer = new QTimer(this);
  m_holdTimer->setInterval(1000);
  m_holdTimer->setSingleShot(true);
  connect(m_holdTimer,SIGNAL(timeout()),this,SLOT(hold_slot()));
}

void DragButton::setInitialScaling(double scaling)
{
  if(scaling <= 1 && scaling > 0)
  {
    m_InitialScaling = scaling;
    m_scaling = scaling;
  }
}

void DragButton::setPixmap(QString pixmap)
{
  m_pixmap.load(pixmap);
  update();
}

void DragButton::setText(QString str)
{
  m_text = str;
  update();
}

void DragButton::setIsHold(bool flag)
{
  isHold = flag;
  update();
}

void DragButton::paintEvent(QPaintEvent *)
{
  if(m_pixmap.isNull())
    return;

  QPainter painter(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);

  int w = m_pixmap.width()*m_scaling;
  int h = 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);
}

void DragButton::enterEvent(QEvent *)
{
  disconnect(m_aniTimer,SIGNAL(timeout()),this,SLOT(zoomOut()));
  connect(m_aniTimer,SIGNAL(timeout()),this,SLOT(zoomIn()));

  m_aniTimer->start();
}

void DragButton::leaveEvent(QEvent *)
{
  disconnect(m_aniTimer,SIGNAL(timeout()),this,SLOT(zoomIn()));
  connect(m_aniTimer,SIGNAL(timeout()),this,SLOT(zoomOut()));

  m_aniTimer->start();
}

void DragButton::mousePressEvent(QMouseEvent *e)
{
  if(!isHold)
    isPress = 1;

  m_holdTimer->start();

  m_mouseSrcPos = e->pos();

  update();
}

void DragButton::mouseReleaseEvent(QMouseEvent *e)
{
  m_holdTimer->stop();

  isPress = 0;
  isHold = 0;

  if(rect().contains(e->pos()))
    emit clicked();

  emit release_signal();

  update();
}

void DragButton::mouseMoveEvent(QMouseEvent *e)
{
  if(isHold)
  {
    move(pos() - m_mouseSrcPos + e->pos());
    emit drag_signal();
  }
  else
    m_mouseSrcPos = e->pos();
}

void DragButton::zoomIn()
{
  m_scaling += 0.01;
  if(m_scaling >= 1)
  {
    m_scaling = 1;
    m_aniTimer->stop();
  }
  update();
}

void DragButton::zoomOut()
{
  m_scaling -= 0.01;
  if(m_scaling <= m_InitialScaling)
  {
    m_scaling = m_InitialScaling;
    m_aniTimer->stop();
  }
  update();
}

void DragButton::hold_slot()
{
  isHold = 1;
  isPress = 0;
  m_aniTimer->stop();
  m_scaling = m_InitialScaling;

  update();
}

整合按鈕的控件

drawwidget.h

#include "dragbutton.h"

class DragWidget : public QWidget
{
  Q_OBJECT

public:
  DragWidget(QWidget *parent = 0);
  ~DragWidget();

  void addButton(DragButton*);

protected:
  QVector<DragButton*> BtnVector;
  QPoint m_mouseSrcPos;//記錄坐標(biāo)點(diǎn)

  void resetInterface();//復(fù)位

signals:

public slots:
  void BtnMove_slots();
  void BtnRelease_slots();
};

#endif // DRAGWIDGET_H

drawwidget.cpp

#include "dragwidget.h"

DragWidget::DragWidget(QWidget *parent)
  : QWidget(parent),m_mouseSrcPos(0,0)
{
}

DragWidget::~DragWidget()
{

}

void DragWidget::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();
}

void DragWidget::resetInterface()
{
  for(int i = 0;i < BtnVector.length();++i)
  {
    BtnVector[i]->setGeometry(i * width()/BtnVector.length(),0,width()/BtnVector.length(),height());
  }
}

void DragWidget::BtnMove_slots()
{
  for(int i = 0;i < BtnVector.length();++i)//找到鼠標(biāo)所在的按鈕
    if(BtnVector[i] == sender())
    {
      int flag = (BtnVector[i]->pos().x() + BtnVector[i]->width()/2)/(width()/BtnVector.length());

      for(int l = 0;l < BtnVector.length();++l)//這里也可以做動(dòng)畫(huà),但這次主要實(shí)現(xiàn)拖動(dòng)的功能
      {
        if(l < i && l <flag)
          BtnVector[l]->setGeometry(l * width()/BtnVector.length(),0,width()/BtnVector.length(),height());
        else if((l > i && l <= flag)||(l >= flag && l < i))
          BtnVector[l]->setGeometry((l + ((i-flag)>0?1:-1))* width()/BtnVector.length(),0,width()/BtnVector.length(),height());
        else if(l > flag && l > i)
          BtnVector[l]->setGeometry(l * width()/BtnVector.length(),0,width()/BtnVector.length(),height());
      }
      //注釋部分合為上面的循環(huán)
//      if(flag >= i)//往后拖
//        for(int l = 0;l < BtnVector.length();++l)
//        {
//          if(l < i)
//            BtnVector[l]->setGeometry(l * width()/BtnVector.length(),0,width()/BtnVector.length(),height());
//          else if(l > i && l <= flag)
//            BtnVector[l]->setGeometry((l - 1)* width()/BtnVector.length(),0,width()/BtnVector.length(),height());
//          else if(l > flag)
//            BtnVector[l]->setGeometry(l * width()/BtnVector.length(),0,width()/BtnVector.length(),height());
//        }
//      else if(flag < i)//往前拖
//        for(int l = 0;l < BtnVector.length();++l)
//        {
//          if(l < flag)
//            BtnVector[l]->setGeometry(l * width()/BtnVector.length(),0,width()/BtnVector.length(),height());
//          else if(l >= flag && l < i)
//            BtnVector[l]->setGeometry((l + 1)* width()/BtnVector.length(),0,width()/BtnVector.length(),height());
//          else if(l > i)
//            BtnVector[l]->setGeometry(l * width()/BtnVector.length(),0,width()/BtnVector.length(),height());
//        }
      break;
    }
}

void DragWidget::BtnRelease_slots()
{
  for(int i = 0;i < BtnVector.length();++i)//找到鼠標(biāo)所在的按鈕
    if(BtnVector[i] == sender())
    {
      int posX = BtnVector[i]->pos().x();
      if(posX < 0)
        posX = 0;
      else if(posX > width())
        posX = width();

      int flag = (posX+BtnVector[i]->width()/2)/(width()/BtnVector.length());

      DragButton *btn = BtnVector[i];//修改vector順序
      if(flag >= i)
        for(int l = i;l < flag;++l)
          BtnVector[l] = BtnVector[l+1];
      else
        for(int l = i;l > flag;--l)
          BtnVector[l] = BtnVector[l-1];

      BtnVector[flag] = btn;
    }

  resetInterface();//復(fù)位
}

使用

main.cpp

#include "dragwidget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
  QApplication a(argc, argv);

  DragWidget ww;
  ww.setGeometry(200,200,800,200);

  DragButton w(&ww);
  w.setPixmap(":/image/image/contacts.png");
  w.setText("按鈕1");
  w.setInitialScaling(0.6);

  DragButton w2(&ww);
  w2.setPixmap(":/image/image/time.png");
  w2.setText("按鈕2");
  w2.setInitialScaling(0.6);

  DragButton w3(&ww);
  w3.setPixmap(":/image/image/checking.png");
  w3.setText("按鈕3");
  w3.setInitialScaling(0.6);

  DragButton w4(&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();

  return a.exec();
}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:

相關(guān)文章

  • 淺談Qt QGraphics體系及刷新機(jī)制介紹

    淺談Qt QGraphics體系及刷新機(jī)制介紹

    這篇文章主要介紹了淺談Qt QGraphics體系及刷新機(jī)制介紹,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • C語(yǔ)言遞歸思想實(shí)現(xiàn)漢諾塔詳解

    C語(yǔ)言遞歸思想實(shí)現(xiàn)漢諾塔詳解

    大家好,本篇文章主要講的是C語(yǔ)言遞歸思想實(shí)現(xiàn)漢諾塔詳解,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話(huà)記得收藏一下
    2022-01-01
  • C++圖文并茂講解繼承

    C++圖文并茂講解繼承

    繼承是C++面向?qū)ο缶幊讨械囊婚T(mén)。繼承是子類(lèi)繼承父類(lèi)的特征和行為,或者是繼承父類(lèi)得方法,使的子類(lèi)具有父類(lèi)得的特性和行為。重寫(xiě)是子類(lèi)對(duì)父類(lèi)的允許訪(fǎng)問(wèn)的方法實(shí)行的過(guò)程進(jìn)行重新編寫(xiě),返回值和形參都不能改變。就是對(duì)原本的父類(lèi)進(jìn)行重新編寫(xiě),但是外部接口不能被重寫(xiě)
    2022-05-05
  • C++?指針常量和常量指針的區(qū)別小結(jié)

    C++?指針常量和常量指針的區(qū)別小結(jié)

    在C++學(xué)習(xí)使用過(guò)程中,每個(gè)人都不可避免地使用指針,而且都或多或少的接觸過(guò)常量指針或指針常量,本文主要介紹了C++?指針常量和常量指針的區(qū)別小結(jié),感興趣的可以了解一下
    2023-12-12
  • c語(yǔ)言B樹(shù)深入理解

    c語(yǔ)言B樹(shù)深入理解

    B樹(shù)是為磁盤(pán)或其他直接存儲(chǔ)設(shè)備設(shè)計(jì)的一種平衡查找樹(shù),本文將詳細(xì)介紹c語(yǔ)言B樹(shù),需要的朋友可以參考下
    2012-11-11
  • C/C++ 中extern關(guān)鍵字詳解

    C/C++ 中extern關(guān)鍵字詳解

    這篇文章主要介紹了C/C++ 中extern關(guān)鍵字詳解的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • C++詳細(xì)分析線(xiàn)程間的同步通信

    C++詳細(xì)分析線(xiàn)程間的同步通信

    線(xiàn)程間不通信的話(huà),每個(gè)線(xiàn)程受CPU的調(diào)度,沒(méi)有任何執(zhí)行上的順序可言,線(xiàn)程1和線(xiàn)程2是根據(jù)CPU調(diào)度算法來(lái)的,兩個(gè)線(xiàn)程都有可能先運(yùn)行,是不確定的,線(xiàn)程間的運(yùn)行順序是不確定的,所以多線(xiàn)程程序出問(wèn)題,難以復(fù)現(xiàn),本章我們就來(lái)了解線(xiàn)程間的同步通信
    2022-05-05
  • C語(yǔ)言左旋字符串的三種實(shí)現(xiàn)方式

    C語(yǔ)言左旋字符串的三種實(shí)現(xiàn)方式

    本文章將使用三種思路實(shí)現(xiàn)字符串的左旋(循環(huán)移動(dòng),截取和拼接,逆序反轉(zhuǎn)),文中通過(guò)代碼示例和圖文介紹的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下
    2024-03-03
  • C++ 容器適配器priority_queue的使用及實(shí)現(xiàn)代碼

    C++ 容器適配器priority_queue的使用及實(shí)現(xiàn)代碼

    這篇文章主要介紹了C++ 容器適配器priority_queue的使用及實(shí)現(xiàn),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • C語(yǔ)言中volatile關(guān)鍵字的深入講解

    C語(yǔ)言中volatile關(guān)鍵字的深入講解

    在程序設(shè)計(jì)中,尤其是在C語(yǔ)言、C++、C#和Java語(yǔ)言中,使用volatile關(guān)鍵字聲明的變量或?qū)ο笸ǔ>哂信c優(yōu)化、多線(xiàn)程相關(guān)的特殊屬性,這篇文章主要給大家介紹了關(guān)于C語(yǔ)言volatile關(guān)鍵字的相關(guān)資料,需要的朋友可以參考下
    2021-07-07

最新評(píng)論