Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何通过拖动鼠标来检查按钮?MouseMoveEvent_C++_Qt_C++11_Mouseevent_Qpushbutton - Fatal编程技术网

C++ 如何通过拖动鼠标来检查按钮?MouseMoveEvent

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>

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

#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(真); }
谢谢您的回答。但是您不能同时选择两个按钮。我需要的是多选。