Как избежать щелчка мышью по одному виджету, вызывающего сигналы в других в Qt?

В моем приложении я использую QTableView для отображения списка изображений, и я выбираю некоторые из изображений, щелкая левой кнопкой мыши и нажимая кнопку управления клавиатурой, когда я это делаю, поэтому приложение выглядит как указанное ниже изображение: введите здесь описание изображения

Но затем, когда я пытаюсь использовать другие кнопки в приложении, такие как "Назначение", а затем пытаюсь выбрать папку назначения, приложение выглядит следующим образом: введите здесь описание изображения

Проблема возникает, когда я нажимаю кнопку "выбрать папку" и пытаюсь выбрать папку. Что происходит, так это то, что щелчок на вкладке выбора папки запускает виджет QTableView, в котором я показываю изображение, и отменяет выбор всех выбранных изображений. Я хочу избежать этого. Теперь я отслеживаю щелчки левой кнопкой мыши на виджете QTableView, как показано ниже:

bool MainWindow::eventFilter(QObject* obj, QEvent *ev)
{
    if(obj == ui->listOfImages->viewport())
    {
        QMouseEvent * mouseEv = static_cast<QMouseEvent*>(ev);
        if((mouseEv->buttons() & Qt::LeftButton) && (QApplication::keyboardModifiers().testFlag(Qt::ControlModifier) == true))
        {
            controlButtonCounter++;
            fetch = true;
            return QObject::eventFilter(obj,ev);
        }
        else if((mouseEv->buttons() & Qt::LeftButton) && (QApplication::keyboardModifiers().testFlag(Qt::ControlModifier) == false))
        {
            if(selectedImages.size()>0)
            {
                ui->listOfImages->clearSelection();
                selectedImages.clear();
            }
            fetch = false;
            controlButtonCounter = 0;
        }
    }
    return QObject::eventFilter(obj,ev);
}

Здесь ui->listOfImages — это виджет QTableView. Другие вещи, такие как controlButtonCounter, не имеют отношения к щелчкам мыши, я использую их для других целей.

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


person the_naive    schedule 30.11.2013    source источник


Ответы (2)


if(obj = ui->listOfImages->viewport())

Вы там не сравниваете, вы присваиваете значение переменной obj.

Это должно быть так:

if(obj == ui->listOfImages->viewport())
person thuga    schedule 02.12.2013
comment
Да, я отредактировал это, и я также изменил это в своем коде, это был просто оговорок и концентрация, спасибо за уведомление. Даже исправление этой ошибки ничего не изменило. - person the_naive; 02.12.2013
comment
@the_naive Вам также следует проверить, является ли типом события на самом деле является событием нажатия/отпускания мыши прежде чем приводить его к событию мыши. - person thuga; 03.12.2013
comment
Спасибо за информацию, но из документации я вижу, что это GraphicsSceneMousePress, что означает, что это объект типа графической сцены, верно? Будет ли это применимо к объекту типа QTableView? Может глупый вопрос, но я в замешательстве. Думаю, мне следует использовать MouseButtonPress, верно? - person the_naive; 04.12.2013
comment
Спасибо, вроде работает. Я вернусь к вам, если у меня возникнут дальнейшие проблемы :). - person the_naive; 04.12.2013
comment
@the_naive QGraphicsSceneMouseEvents используются только в графическом представлении рамки. - person thuga; 04.12.2013

Я не уверен, но, возможно, это может вам помочь:

void setWindowModality(Qt::WindowModality windowModality)

Это свойство определяет, какие окна заблокированы модальным виджетом.

Это свойство имеет смысл только для окон. Модальный виджет не позволяет виджетам в других окнах получать ввод. Значение этого свойства определяет, какие окна блокируются, когда виджет виден. Изменение этого свойства, когда окно видимо, не имеет никакого эффекта; вы должны сначала hide() виджет, а затем show() еще раз.

По умолчанию это свойство Qt::NonModal.

person Eugene    schedule 30.11.2013
comment
Нет, даже тогда это не работает, ввод каким-то образом достигает функции события. - person the_naive; 01.12.2013
comment
@the_naive, попробуйте этот метод void setAttribute (Qt::WidgetAttribute attribute, bool on = true) с атрибутом Qt::WA_NoMousePropagation (или, возможно, Qt::WA_TransparentForMouseEvents, Qt::WA_NoMouseReplay) - person Eugene; 01.12.2013