как у QWidget убрать блокировку получения событий мыши если уже кнопка мыши уже нажата над другим виджетом

есть группа объектов отнаследованных от QWidget которые расположены на QGridLayout. Я нажимаю над одним из них кнопку мыши(допустим левую) и у этого виджета меняется цвет, после я с зажатой кнопкой веду курсор на другой виджет и хочу чтобы у него тоже поменялся цвет, но этого не происходит. Я пытался переопределять события event(QEvent *e), mouseMoveEvent, pressEvent, и проверять какая кнопка мыши нажата, но это не помогает т.к. при нажатии кнопки мыши происходит запрет на отправку событий мыши для всех остальных объектов, я пробовал также вызывать releaseMouse() в данных переопределённых функциях, но и это не помогло. В итоге пришлось сделать так:

void Block :: enterEvent(QEvent *e)
{
   if(qApp->keyboardModifiers() == Qt::AltModifier 
      || qApp->mouseButtons() == Qt::LeftButton) 
   {
     // тут меняем цвет блока на нужный
   }
}

Этот способ работает, но всё же хотелось бы узнать как-то можно это сделать через зажимание кнопки мыши и без использование клавиатуры?


Ответы (1 шт):

Автор решения: Alexander Chernin

Если это то, что вам нужно, то я сделал так; разместил на MainWindow QGridLayout в который поместил виджеты, для примера, типа QFrame:

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

void MainWindow::mouseMoveEvent(QMouseEvent *evt)
{
    QMainWindow::mouseMoveEvent(evt);

    // Получаем виджет под курсором
    QWidget* w = this->childAt(evt->pos());
    
    // Если виджет наследуется от QFrame, то
    if (dynamic_cast<QFrame*>(w) != nullptr) {
        // Устанавливаем цвет в красный
        w->setStyleSheet("background-color: red");
    }
}
→ Ссылка