У меня есть 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 год перерыва в моем прошлом опыте кодирования, так Я уверен, что упускаю что-то очевидное здесь с точки зрения распространения событий.