如何通过拖动鼠标QT检查按钮?鼠标移动事件
How to check pushButtons with draging the mouse QT ? MouseMoveEvent
我有 5 个按钮 ( pushButton_i ) i = 1, 2, 3, 4, 5。
我想要做的是拖动鼠标(按下按钮),然后在 "Yes" 上设置选中按钮的文本,否则在 "NO" 上。
我尝试了以下代码,但结果是:当我按下鼠标按钮然后稍微移动它时,所有按钮的文本都设置为 "NO"。
这是我的代码:
#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");
}
}
谁能给我解释一下这是怎么回事?
来自文档:
QMouseEvent::pos()
reports the position of the mouse cursor, relative to this widget
但是,您可以通过将按钮置于点 (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");
}
问题是,我不知道如何才能不沮丧。但至少它有效 xD。我将所有按钮的文本设置为 "No" 并通过 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);
}
我有 5 个按钮 ( pushButton_i ) i = 1, 2, 3, 4, 5。 我想要做的是拖动鼠标(按下按钮),然后在 "Yes" 上设置选中按钮的文本,否则在 "NO" 上。 我尝试了以下代码,但结果是:当我按下鼠标按钮然后稍微移动它时,所有按钮的文本都设置为 "NO"。 这是我的代码:
#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");
}
}
谁能给我解释一下这是怎么回事?
来自文档:
QMouseEvent::pos()
reports the position of the mouse cursor, relative to this widget
但是,您可以通过将按钮置于点 (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");
}
问题是,我不知道如何才能不沮丧。但至少它有效 xD。我将所有按钮的文本设置为 "No" 并通过 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);
}