C++ 如何通过拖动鼠标来检查按钮?MouseMoveEvent
我有5个按钮(按钮_I)I=1、2、3、4、5。 我要做的是拖动鼠标(按下按钮),然后将选中按钮的文本设置为“是”,否则设置为“否”。 我尝试了下面的代码,但结果是:当我按下鼠标按钮并稍微移动它时,所有按钮的文本都设置为“否”。 这是我的代码:C++ 如何通过拖动鼠标来检查按钮?MouseMoveEvent,c++,qt,c++11,mouseevent,qpushbutton,C++,Qt,C++11,Mouseevent,Qpushbutton,我有5个按钮(按钮_I)I=1、2、3、4、5。 我要做的是拖动鼠标(按下按钮),然后将选中按钮的文本设置为“是”,否则设置为“否”。 我尝试了下面的代码,但结果是:当我按下鼠标按钮并稍微移动它时,所有按钮的文本都设置为“否”。 这是我的代码: #include "mainwindow.h" #include "ui_mainwindow.h" #include <QString> #include<QEvent> #include <QMouseEvent>
#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");
}
}
#包括“mainwindow.h”
#包括“ui_main window.h”
#包括
#包括
#包括
#包括
主窗口::主窗口(QWidget*父窗口)
:QMainWindow(父级)
,ui(新ui::Main窗口)
{
用户界面->设置用户界面(此);
}
MainWindow::~MainWindow()
{
删除用户界面;
}
void主窗口::mouseMoveEvent(QMouseEvent*事件)
{
QString键;
对于(inti=1;icentralwidget->findChild(键);
QRect widgetRect=按钮->几何体();
widgetRect.moveTopLeft(按钮->父窗口小部件()->mapToGlobal(widgetRect.topLeft());
如果(按钮->矩形()包含(事件->位置())按钮->设置文本(“是”);
else按钮->设置文本(“否”);
}
}
有人能给我解释一下发生了什么吗?来自文档:
QMouseEvent::pos()
报告鼠标光标相对于此小部件的位置
但是,您可以在点(0,0)处更改按钮的位置。我不知道为什么要重新定位按钮。尝试以下方法:
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");
}
void ButtonDrag::mouseMoveEvent(QMouseEvent*event)
{
QString键;
for(int i=1;i findChild(key);
按钮->设置文本(“否”);
}
QWidget*child=ui.centralWidget->childAt(事件->位置());
QPushButton*affectedBtn=动态施法(儿童);
如果(受影响的BTN)
affectedBtn->setText(“是”);
}
问题是,我不知道如何在没有向下转换的情况下实现它。但至少它可以工作xD。我将所有按钮的文本设置为“否”,并通过ui.centralWidget->childAt(event->pos())获取受影响的BTN(如果有),我必须向下转换才能使用setText方法
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);
}
{
QString键;
对于(int i=1;i centralwidget->findChild(key);
按钮->可设置检查(真);
}
QWidget*child=ui->centralwidget->childAt(事件->位置());
QPushButton*affectedBtn=动态施法(儿童);
如果(受影响的BTN)
affectedBtn->setChecked(真);
}
谢谢您的回答。但是您不能同时选择两个按钮。我需要的是多选。