我使用的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();
}