原理
重写GUI类中的鼠标事件的响应函数,并实现其响应函数。
代码如下
头文件
#include <QMouseEvent>
*.h
enum MouseState
{
L_C,
R_C,
M_C,
L_DC,
R_DC,
Wheel,
Release
};
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
void setMouseState(MouseState ms, int wheelVal);
void setMouseUIdefault();
private:
Ui::MainWindow *ui;
protected:
void mouseMoveEvent(QMouseEvent *event);
void mousePressEvent(QMouseEvent *event);
void mouseReleaseEvent(QMouseEvent *event);
void mouseDoubleClickEvent(QMouseEvent *event);
void wheelEvent(QWheelEvent *event);
void keyPressEvent(QKeyEvent *event);
};
*.c
void MainWindow::mouseMoveEvent(QMouseEvent *event)
{
QPoint p_ab = event->globalPos();
QPoint p_re = event->pos();
QString str;
str = QString("%1 , %2").arg(p_ab.x()).arg(p_ab.y());
ui->abs_lineEdit->setText(str);
str = QString("%1 , %2").arg(p_re.x()).arg(p_re.y());
ui->rel_lineEdit->setText(str);
}
void MainWindow::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton){
setMouseState( MouseState::L_C, 0);
}
else if (event->button() == Qt::RightButton){
setMouseState(MouseState::R_C, 0);
}
else if (event->button() == Qt::MidButton){
setMouseState(MouseState::M_C, 0);
}
}
void MainWindow::mouseReleaseEvent(QMouseEvent *event)
{
setMouseState(MouseState::Release, 0);
}
void MainWindow::mouseDoubleClickEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton){
setMouseState(MouseState::L_DC, 0);
}
else if (event->button() == Qt::RightButton){
setMouseState(MouseState::R_DC, 0);
}
}
void MainWindow::wheelEvent(QWheelEvent *event)
{
int wheel_val = event->delta();
setMouseState(MouseState::Wheel, wheel_val);
}
void MainWindow::setMouseState(MouseState ms, int wheelVal)
{
QString style_active = "border:2px solid black;background:green";
QString style_release = "border:2px solid black;";
setMouseUIdefault();
switch (ms)
{
case L_C:
ui->lab_mL->setStyleSheet(style_active);
break;
case R_C:
ui->lab_mR->setStyleSheet(style_active);
break;
case M_C:
ui->lab_mM->setStyleSheet(style_active);
break;
case L_DC:
ui->lab_mL_D->setStyleSheet(style_active);
break;
case R_DC:
ui->lab_mR_D->setStyleSheet(style_active);
break;
case Wheel:
ui->lab_mM_val->setText(QString("%1").arg(wheelVal));
if (wheelVal>0)
{
ui->lab_mM_up->setStyleSheet(style_active);
ui->lab_mM_down->setStyleSheet(style_release);
}
else
{
ui->lab_mM_up->setStyleSheet(style_release);
ui->lab_mM_down->setStyleSheet(style_active);
}
break;
case Release:
setMouseUIdefault();
break;
}
}
void MainWindow::setMouseUIdefault()
{
QString style_release = "border:2px solid black;";
ui->lab_mR_D->setStyleSheet(style_release);
ui->lab_mR->setStyleSheet(style_release);
ui->lab_mL_D->setStyleSheet(style_release);
ui->lab_mL->setStyleSheet(style_release);
ui->lab_mM->setStyleSheet(style_release);
ui->lab_mM_up->setStyleSheet(style_release);
ui->lab_mM_down->setStyleSheet(style_release);
}
void MainWindow::keyPressEvent(QKeyEvent *event)
{
qDebug() << "=== press key";
int keyValue = event->key();
if (keyValue == Qt::Key_Control)
{
QPoint pt = QCursor::pos();
QString str;
str = QString("%1 , %2").arg(pt.x()).arg(pt.y());
ui->abs_edit->setText(str);
}
}
效果如下