如何通过拖动鼠标 QT 检查按钮?鼠标移动事件

Posted

技术标签:

【中文标题】如何通过拖动鼠标 QT 检查按钮?鼠标移动事件【英文标题】:How to check pushButtons with draging the mouse QT ? MouseMoveEvent 【发布时间】:2020-01-26 11:33:26 【问题描述】:

我有 5 个按钮 ( pushButton_i ) i = 1, 2, 3, 4, 5。 我想要做的是拖动鼠标(按下按钮),然后在“是”上拖动选中按钮的 setText,否则在“否”上。 我尝试了以下代码,但结果是:当我按下鼠标按钮然后稍微移动它时,所有按钮的文本都设置为“否”。 这是我的代码:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QString>
#include<QEvent>
#include <QMouseEvent>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)

    ui->setupUi(this);



MainWindow::~MainWindow()

    delete ui;


void MainWindow::mouseMoveEvent(QMouseEvent *event)

    QString key;
    for (int i=1;i<=5;i++)
        key = QString("pushButton_%1").arg(i);
        QPushButton *button = ui->centralwidget->findChild<QPushButton*>(key);
        QRect widgetRect = button->geometry();
        widgetRect.moveTopLeft(button->parentWidget()->mapToGlobal(widgetRect.topLeft()));
        if (button->rect().contains(event->pos())) button->setText("Yes");
        else button->setText("No");





谁能给我解释一下这是怎么回事?

【问题讨论】:

【参考方案1】:

来自文档:

QMouseEvent::pos() 报告鼠标光标相对于这个小部件的位置

但是,您可以通过使按钮位于点 (0, 0) 来更改按钮的位置。我不知道你为什么要重新定位按钮。

【讨论】:

【参考方案2】:

试试这个:

   void ButtonDrag::mouseMoveEvent(QMouseEvent *event)
    
      QString key;
      for (int i = 1; i <= 5; i++)
      
        key = QString("pushButton_%1").arg(i);
        QPushButton *button = ui.centralWidget->findChild<QPushButton*>(key);  
        button->setText("No");
      

      QWidget* child = ui.centralWidget->childAt(event->pos());
      QPushButton* affectedBtn = dynamic_cast<QPushButton*>(child);
      if (affectedBtn)
        affectedBtn->setText("Yes");
    

问题是,如果没有沮丧,我不知道该怎么做。但至少它有效xD。我将所有按钮的文本设置为“否”,并通过 ui.centralWidget->childAt(event->pos()) 获取受影响的Btn(如果有的话),我必须向下转换才能使用 setText 方法

【讨论】:

感谢您的回答。但是,您不能同时选择两个按钮。我需要的是多选。【参考方案3】:
void MainWindow::mouseMoveEvent(QMouseEvent *event)
   
     QString key;
     for (int i = 1; i <= 5; i++)
     
       key = QString("pushButton_%1").arg(i);
       QPushButton *button = ui->centralwidget->findChild<QPushButton*>(key);
       button->setCheckable(true);

     

     QWidget* child = ui->centralwidget->childAt(event->pos());
     QPushButton* affectedBtn = dynamic_cast<QPushButton*>(child);

     if (affectedBtn)
       affectedBtn->setChecked(true);
   

【讨论】:

以上是关于如何通过拖动鼠标 QT 检查按钮?鼠标移动事件的主要内容,如果未能解决你的问题,请参考以下文章

如何识别 QGraphicsView 鼠标移动事件?

Qt自定义界面边框后,移动鼠标拖动界面,界面会拖到任务栏以下。。。如何解决?

qt中当鼠标移到按钮上如何改变颜色

Qt 的鼠标事件

qt 画多边形(实现鼠标拖动节点)

qt鼠标悬停在按钮变大