Qt.Игнорировать любые события мыши в виджете над другим - PullRequest
1 голос
/ 07 июня 2019

У меня есть QTableView, где появляется небольшая отметка, если курсор мыши находится на активной ячейке. Эта метка является виджетом и издает сигнал при наведении курсора, изменяя режим выбора таблицы, когда я перетаскиваю ее по таблице. Проблема в том, что, если я переступил черту, я не могу перетаскивать стол. Вещи, которые я пробовал:

  • Установите метку виджета как setWindowFlags(Qt::WindowTransparentForInput);, но я не могу использовать ее, потому что мне нужно событие при наведении.
  • Игнорировать события в метке виджета с помощью event->ignore() или отправлять событие родителю с помощью и eventFilter:

    bool EventFilterMarca::eventFilter(QObject *obj, QEvent *event)
    {
         if( event->type() == QEvent::HoverMove)
         {
           ....
         }
         else if (event->type() == QEvent::MouseButtonPress ||
                              event->type() == QEvent::MouseButtonRelease ||
                              event->type() == QEvent::MouseMove ||
                              event->type() == QEvent::MouseButtonDblClick)
                    {                
                        //QApplication::sendEvent(parent(),event);//one try
                        //event->ignore();//another try
                        return QObject::eventFilter(obj,event);;
                    }
            }
    
  • Подклассы mousePressEvent, mouseReleaseEvent и mouseMoveEvent в виджете меток и вызов родительского класса. Похоже, если это работает (передать событие родительскому элементу) в текущую ячейку таблицы (родительский элемент):

void Marca::mousePressEvent(QMouseEvent *event)

{
    //event->setAccepted(false);
    if(event->buttons() == Qt::LeftButton)
    {
        MiTabla* tabla = qobject_cast<MiTabla*>(parent());
        if (tabla)
        {
            tabla->mousePressEvent(event);
            //QApplication::sendEvent(parent(),event);
        }
    }
    //event->ignore();
}

Ну, вопрос в том, как сделать так, чтобы поведение таблицы было таким же, если я нахожусь над виджетом ячейки или прямо на ячейке.

Также я добавляю ссылку с моим первым подходом к ее получению. Это работает, но код ужасен, и за ним нелегко следовать:

https://github.com/exodehm/tablacalc

1 Ответ

0 голосов
/ 08 июня 2019

Я думаю, что фильтр событий не то, что вы хотите.Это то, что делает виджет не получать определенные события.Что вы на самом деле хотите сделать, так это пометить событие как необработанное конкретным виджетом, поместив его выше в классе для обработки.Для этого вы должны попытаться переопределить либо метод widgets :: event, либо более конкретный обработчик.

В qt docs написано, что:

bool QWidget :: event(QEvent * event)

Эта функция возвращает true, если событие было распознано, иначе возвращает false.Если распознанное событие было принято (см. QEvent :: accept), любая дальнейшая обработка, такая как распространение события в родительский виджет, прекращается.

Так что я думаю, что вы должны сделать, это в основном пометить событие как непринимается, когда для вашего виджета происходит конкретный тип события, которое вы хотите распространить в родительский виджет.

Так что в вашем случае я бы ожидал что-то вроде:

void QWidget::dropEvent(QDropEvent *event) {
   event->setAccepted(false);
}

Также для того, чтобы это работалотаблица должна быть родительским виджетом виджета метки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...