实现对qpushbutton 删除,新建,双击

qpushbutton的删除,新建,双击的实现

*代码功能描述:有个模板button。 A:对其单击左键移动能新建一个button(任意位置) B:对新建的对象也可以任意移动,单击对象右键能删除对象 C: 本打算双击可以编辑文字(发现有点难实现,就没有继续完善了)

实现新建,删除

a:重写鼠标事件类 (.h)

#ifndef MYBUTTON_H
#define MYBUTTON_H

#include <QMainWindow>
#include <QPushButton>
#pragma execution_character_set("UTF-8") //utf-8编码
#include<QMouseEvent>

class myButton : public QPushButton
{
    Q_OBJECT
public:
    explicit myButton(QWidget *parent = nullptr);
    QPoint p;

signals:
    void ok();    // 确定已经新建好了一个 button对象    
    void labXy(QPoint); // 传出qpushbutton移动的点的坐标
    
protected:
    void mousePressEvent(QMouseEvent *event);  //鼠标重写事件
    void mouseMoveEvent(QMouseEvent *event);
    void mouseReleaseEvent(QMouseEvent *event);
public slots:
};

#endif // MYBUTTON_H

b:重写鼠标类事件(.cpp)

#include "mybutton.h"
#include "qdebug.h"
#include "ui_mainwindow.h"
myButton::myButton(QWidget *parent) : QPushButton(parent)
{
  
}
void myButton::mouseMoveEvent(QMouseEvent *e)
{
    if (e->buttons()&Qt::LeftButton)
    {
        emit labXy(e->globalPos()-p);
    }
}

void myButton::mousePressEvent(QMouseEvent *e)
{
  if (e->button()==Qt::LeftButton)
  {
        p=e->globalPos()-this->frameGeometry().topLeft();
  }
}
void myButton::mouseReleaseEvent(QMouseEvent *e)
{
  emit ok();
}

c:mainwindow .h程序

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    
    Cbutton *lab;//对象
    bool flag=true;//新建标志位
public:
    Ui::MainWindow *ui;
public slots:
    void labXy(QPoint);//移动位置
    void ok();//确认新建的button
    void deldel();//删除控件
    void textChange();//改变文本

d: mainwindow .cpp程序

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "qdebug.h"
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    
    connect(ui->pushButton,&myButton::labXy,this,&MainWindow::labXy);//移动触发坐标信号与槽
    connect(ui->pushButton,&myButton::ok,this,&MainWindow::ok);     //确认已完成新建的信号与槽   
}
MainWindow::~MainWindow()
{
    delete ui;
}
void MainWindow::labXy(QPoint p)
{
    if (flag)
    {
        lab=new Cbutton(this);//另外一个button类。
        lab->setText("我的");
        lab->setGeometry(ui->pushButton->geometry());//设定同一大小
        lab->show();
        flag=false;
        connect(lab,&Cbutton::rightClicked,this,&MainWindow::deldel); //右键删除
        connect(lab,&Cbutton::doubleClicked,this,&MainWindow::textChange);//双击信号
    }
    lab->move(p); //移动位置
}
void MainWindow::ok()
{
    flag=true;  //不会重复触发新建标志
}
void MainWindow::deldel()
{
   qDebug()<<sender()->objectName(); //删除button
   QPushButton *w=qobject_cast<QPushButton* >(sender());
   w->deleteLater();
}
void MainWindow::textChange()
{
   QString tex =lab->text(); 
   qDebug()<<tex;
}

双击按钮事件

重写第二个鼠标继承事件类,大同小异
主要看 cpp代码

void Cbutton::mouseMoveEvent(QMouseEvent *e)
{
    if (e->buttons()&Qt::LeftButton)
    {
       this->move(e->globalPos()-p);
    }
}

void Cbutton::mousePressEvent(QMouseEvent *e)
{
  if (e->button()==Qt::LeftButton)
  {
        p=e->globalPos()-this->frameGeometry().topLeft();
        qDebug()<<QTime::currentTime();
   }
  if (e->button()==Qt::RightButton)
  {
      emit rightClicked();
  }
}
void Cbutton::mouseDoubleClickEvent(QMouseEvent *event) //双击事件
{
    qDebug()<<"1"<<QTime::currentTime();
    if (event->button()==Qt::LeftButton)
        emit doubleClicked();
}

over,有同样想法的可以私聊,做一个类似于qtcretor ui编辑那样的东西,可以拉出来 编辑,删除,最好还能命名对象的 使用名,eg:ui.pushbutton,

发布了7 篇原创文章 · 获赞 4 · 访问量 351

猜你喜欢

转载自blog.csdn.net/a1ngel/article/details/103852042