关于QT中QPushbutton中边界问题的解决方案

我使用的QT版本是5.14.1,创建项目的时候选择的是MinGW32-bit,在使用QPushbutton编写一个小demo中遇到一个问题,此demo实现的功能是在Dialog窗口中创建一个pushbutton,当按下鼠标时该按钮向下移动,松开鼠标时,该按钮会向上移动回到原来的位置;但是当具体实现时,当在pushbutton的边界按下与释放鼠标时,该按钮只会向下移动,而不会向上移动回到原来的位置,通过调试代码可以看到在点击边界时,只调用了点击事件的槽方法,而不会调用释放事件的槽方法。

代码如下:

//dialog.h
#include <QDialog>

QT_BEGIN_NAMESPACE
namespace Ui { class Dialog; }
QT_END_NAMESPACE

class Dialog : public QDialog
{
    Q_OBJECT

public:
    Dialog(QWidget *parent = nullptr);
    ~Dialog();

private slots:
    void on_pushButton_pressed();

    void on_pushButton_released();

private:
    Ui::Dialog *ui;
    
};
#endif // DIALOG_H


//dialog.cpp
Dialog::Dialog(QWidget *parent)
    : QDialog(parent)
    , ui(new Ui::Dialog)
{
    ui->setupUi(this);
}

Dialog::~Dialog()
{
    delete ui;
}


void Dialog::on_pushButton_pressed()
{
    qDebug()<<"调用on_pushButton_pressed";
    ui->pushButton->move(ui->pushButton->x(),ui->pushButton->y()+10);
}

void Dialog::on_pushButton_released()
{
    qDebug()<<"调用on_pushButton_released";
    ui->pushButton->move(ui->pushButton->x(),ui->pushButton->y()-10);
}


//main.cpp
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Dialog w;
    w.show();
    return a.exec();
}

QPushbutton边界问题

此文章给出了两个解决方案:

解决方案一,将上移和下移代码都在点击事件的槽方法中进行实现,使用QEventLoop进行休眠,以达到视觉上的移动,代码如下():

Dialog::Dialog(QWidget *parent)
    : QDialog(parent)
    , ui(new Ui::Dialog)
{
    ui->setupUi(this);
}

Dialog::~Dialog()
{
    delete ui;
}

void Dialog::on_pushButton_pressed()
{
    qDebug()<<"调用on_pushButton_pressed";
    ui->pushButton->move(ui->pushButton->x(),ui->pushButton->y()+10);

    int msec=500;
    QTime timeout=QTime::currentTime().addMSecs(msec);
    while(QTime::currentTime()<timeout){
        QCoreApplication::processEvents(QEventLoop::AllEvents);
    }

    ui->pushButton->move(ui->pushButton->x(),ui->pushButton->y()-10);
}

void Dialog::on_pushButton_released()
{
    qDebug()<<"调用on_pushButton_released";

}

解决方案二,对按钮的的点击范围进行设置,当鼠标在按钮边界进行点击时,不实现按钮的移动,即可避免只下移的情况发生。解决代码如下:

//dialog.h
#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>

QT_BEGIN_NAMESPACE
namespace Ui { class Dialog; }
QT_END_NAMESPACE

class Dialog : public QDialog
{
    Q_OBJECT

public:
    Dialog(QWidget *parent = nullptr);
    ~Dialog();

private slots:
    void on_pushButton_pressed();

    void on_pushButton_released();

private:
    Ui::Dialog *ui;
    bool isButtonMove=false;
};
#endif // DIALOG_H


//dialog.cpp
#include "dialog.h"
#include "ui_dialog.h"
#include<QDebug>
#include<QEventLoop>
#include<QTime>

Dialog::Dialog(QWidget *parent)
    : QDialog(parent)
    , ui(new Ui::Dialog)
{
    ui->setupUi(this);
}

Dialog::~Dialog()
{
    delete ui;
}

void Dialog::on_pushButton_pressed()
{
    qDebug()<<"调用on_pushButton_pressed";
    QPoint pos_overall=QCursor::pos();
    QPoint pos_object=this->mapFromGlobal(pos_overall);

    if(pos_object.y()>ui->pushButton->y()+10){
         ui->pushButton->move(ui->pushButton->x(),ui->pushButton->y()+10);
         isButtonMove=true;
    }

}

void Dialog::on_pushButton_released()
{
    qDebug()<<"调用on_pushButton_released";
    if(isButtonMove){
        ui->pushButton->move(ui->pushButton->x(),ui->pushButton->y()-10);
        isButtonMove=false;
    }


}

//main.cpp
#include "dialog.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Dialog w;
    w.show();
    return a.exec();
}

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

love_meng1114

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值