[英]How to check pushButtons with draging the mouse QT ? MouseMoveEvent
我有 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");
}
}
有人可以向我解釋發生了什么嗎?
從文檔:
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");
}
問題是,我不知道如何在沒有沮喪的情況下做到這一點。 但至少它有效 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);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.