QItemDelegate с собственной обработкой editorEvent () захватывает щелчки правой кнопкой мыши, которые я хочу получить в QTreeView - PullRequest
0 голосов
/ 17 января 2020

У меня есть QTreeView виджет, который использует собственный класс QStyledItemDelegate (для этого вопроса это то же самое, что и QItemDelegate).

QStyledItemDelegate переопределяет editorEvent(...) для обработки указать c события щелчка левой кнопкой мыши на основе содержимого.

Мне нужно расширить представление дерева для поддержки копирования значений (первый столбец - это имя, второй - фактическое стилизованное значение - редактирование строки, spinbox , выпадающее меню, флажок) с Ctrl + C (вещь QShortcut) и щелчком правой кнопкой мыши на имени записи (первый столбец).

Мой план состоит в том, чтобы установить обработчик событий в моем древовидном представлении, которое будет обрабатывать щелчки правой кнопкой мыши - получить текущий выбранный индекс, получить значение, преобразовать его в строку и отправить его в QClipboard.

Проблема: перед загрузкой модель, то есть мое дерево пусто, мой обработчик событий обнаруживает щелчки правой кнопкой мыши без каких-либо проблем. Однако, как только модель была загружена, это делегат, который берет на себя мышь в терминах кликов. Я обнаружил, что, наблюдая мои журналы отладки как в eventFilter(...) моего обработчика событий, так и в editorEvent(...) моего делегата.

Вот мой eventFilter(...) для обработчика событий, который я установить, используя installEventFilter(...) моего дерева:

auto MouseKeyPressFilter::eventFilter(QObject *watched, QEvent *event) -> bool
{
    qDebug() << "Mouse event filter activated";
    if (event->type() == QEvent::MouseButtonRelease)
    {
        qDebug() << "Mouse event filter: right button released";
        auto mouseEvent = static_cast<QMouseEvent*>(event);
        if (mouseEvent->button() == Qt::RightButton)
        {
            qDebug() << "Pressed with right button";
            event->accept();
        }

        return QObject::eventFilter(watched, event);
    }
    else
    {
        // When model has been loaded, MouseButtonRelease are no longer processed and this
        // message occurs 
        qDebug() << "Mouse event filter: not related to button release event";

        return QObject::eventFilter(watched, event);
    }
}

Делегатский editorEvent(...) выглядит следующим образом:

auto CustomizedItemDelegate::editorEvent(QEvent* event, QAbstractItemModel* model, const QStyleOptionViewItem& option, const QModelIndex& index) -> bool
{
    if (!index.isValid())
    {
        return false;
    }

    auto mouseEvent = static_cast<QMouseEvent*>(event);

    // Added this debugging purposes!
    if (mouseEvent->button() == Qt::RightButton)
    {
        qDebug() << "Delegate received right mouse click";
    }

    // Handling of left mouse button clicks
    if (mouseEvent->button() == Qt::LeftButton)
    {
        // Process left mouse button clicks based on what value the delegate stores
        // ...

        case QEvent::MouseButtonPress:
        {
            // ...
            event->accept();
            return true;
        }
        case QEvent::MouseButtonRelease:
        {
            // ...
            event->accept();
            return true;
        }
    }

}

У меня был 1 год перерыва в моем прошлом опыте кодирования, так Я уверен, что упускаю что-то очевидное здесь с точки зрения распространения событий.

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