实现键盘控制按钮移动以及限制移动
环境:QT5,mingw
主要知识点:keyPressEvent事件处理,QRect矩形的使用
功能简介:键盘方向键控制按钮移动,以及移动到指定位置后禁止移动。
在没碰到label时,按钮可以自由移动
当按钮移动和label相交是,不可继续向下或向左或右或上移动。
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include<QMainWindow> #include<QPushButton> #include<QKeyEvent> #include<QApplication> #include <QRect> #include<QMessageBox> QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACE class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = nullptr); ~MainWindow(); protected: void keyPressEvent(QKeyEvent *event)override; private: Ui::MainWindow *ui; QRect labelBottomRect; QRect labelLeftRect; QRect labelRightRect; QRect labelTopRect; QRect buttonRect; }; #endif // MAINWINDOW_H
#include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); setFocusPolicy(Qt::StrongFocus); //获取四个标签的几何属性,包括位置和大小信息 labelBottomRect = ui->labelBottom->geometry(); labelLeftRect = ui->labelLeft->geometry(); labelRightRect = ui->labelRight->geometry(); labelTopRect = ui->labelTop->geometry(); } MainWindow::~MainWindow() { delete ui; } void MainWindow::keyPressEvent(QKeyEvent *event) { int step=4; // 设置每次移动的步长 // 获取按钮矩形区域 QRect btnRect = ui->pushButton->geometry(); // 根据按键来移动按钮 if (event->key() == Qt::Key_Left) { btnRect.translate(-step, 0); // 向左移动 } else if (event->key() == Qt::Key_Right) { btnRect.translate(step, 0); // 向右移动 } else if (event->key() == Qt::Key_Up) { btnRect.translate(0, -step); // 向上移动 } else if (event->key() == Qt::Key_Down) { btnRect.translate(0, step); // 向下移动 } // 检查按钮和标签是否相交 bool flag=(btnRect.intersects(labelBottomRect))||(btnRect.intersects(labelLeftRect))||(btnRect.intersects(labelRightRect))||(btnRect.intersects(labelTopRect)); if (!flag) { // 按钮和标签不相交,允许移动 ui->pushButton->setGeometry(btnRect); } else { QMessageBox::information(this, QString::fromLocal8Bit("信息提示"), QString::fromLocal8Bit("此处不可越过")); } QMainWindow::keyPressEvent(event); }#QT##c++#