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,