如何通过拖动鼠标QT检查按钮? MouseMoveEvent

问题描述 投票:0回答:3

我有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");
}

}


有人可以告诉我发生了什么事吗?

c++ qt c++11 mouseevent qpushbutton
3个回答
0
投票

摘自文档:

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

但是,您可以通过将按钮置于点(0,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方法


0
投票
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);
   }
© www.soinside.com 2019 - 2024. All rights reserved.