case PicaHelper::ColumnForMethodic::TasksLinks:{
QStyleOptionViewItem opt2 = option;
initStyleOption(&opt2, index);
const QAbstractItemModel *model = index.model();
QString linkText = model->data(index, Qt::DisplayRole).toString();
QUrl url(linkText);
// Определяем стиль ссылки
QTextCharFormat linkFormat;
linkFormat.setAnchor(true);
// Получаем цвет текста элемента
QColor textColor = opt2.palette.text().color();
// Устанавливаем цвет ссылки в соответствии с цветом текста элемента
QColor linkColor = (textColor.red() == 0 && textColor.green() == 0 && textColor.blue() == 0) ? QColor(0x00, 0x00, 0xFF) : QColor(0x00, 0x00, 0x00);
linkFormat.setForeground(linkColor);
// // Включаем HTML-разметку для ячейки
opt.widget->style()->drawControl(QStyle::CE_ItemViewItem, &opt2, painter, opt2.widget);
painter->save();
painter->translate(opt2.rect.topLeft());
// Отображение ссылки
QTextDocument doc;
doc.setDefaultStyleSheet("a {color: " + linkColor.name() + "; text-decoration: underline;}");
doc.setDefaultFont(opt2.font);
doc.setHtml("<a href=\"" + url.toString() + "\">" + url.toString() + "</a>");
QTextCursor cursor(&doc);
cursor.select(QTextCursor::Document);
cursor.mergeCharFormat(linkFormat);
cursor.clearSelection();
doc.drawContents(painter);
painter->restore();
}
break;
Подозреваю что строчка opt.widget->style()->drawControl(QStyle::CE_ItemViewItem, &opt2, painter, opt2.widget); - лишняя
В итоге я с этим не разобрался и сделал иначе Уже работает, разбираюсь с QEvent и обработкой нажатий)
Теперь хочется обрабатывать двойное и одиночное нажатие по-разному, а срабатывают они как-то друга за другом, вот хочу понять, что и как
https://doc.qt.io/qt-6/qwidget.html#mouseDoubleClickEvent смотри в эту сторону и переопределяй соответствующие методы ивент хэндлеров
Не, это знаю Мне в делегате переопределить надо
Вопрос просто в том, как отлавливается двойное нажатие мыши, если перед этим выполняются сначала QEvent::MouseButtonPress, затем QEvent::MouseButtonRelease и только потом двойное
Насколько я помню, делегат не занимается генерацией и обработкой ивентов, его задача отрисовать элемент и/или редактор виджет для элемента, но не переопределять поведения при событии
bool TreeViewItemDelegate::editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index) { if(event->type() == QEvent::MouseButtonDblClick){ qDebug()<<"DBL"; if(index.column() == PicaHelper::ColumnForMethodic::TasksLinks){ QLineEdit *lineEdit = new QLineEdit(const_cast<QWidget*>(option.widget)); lineEdit->setText(index.data(Qt::EditRole).toString()); lineEdit->selectAll(); lineEdit->setGeometry(option.rect); lineEdit->setFocus(); connect(lineEdit, &QLineEdit::editingFinished, this, [lineEdit, model, index](){ model->setData(index, lineEdit->text(), Qt::EditRole); lineEdit->deleteLater(); }); } } else if(event->type() == QEvent::MouseButtonRelease) { qDebug()<<"RELEASE"; if(m_view->typeWidget() == PicaHelper::TreeViewWidgetType::TreeViewForMethodic){ switch(index.column()){ case PicaHelper::ColumnForMethodic::StateActionOrContainer: return model->setData(index, true, Qt::CheckStateRole); case PicaHelper::ColumnForMethodic::CompletionSign: return model->setData(index, true, Qt::CheckStateRole); } } } else if(event->type() == QEvent::MouseButtonPress){ qDebug()<<"PRESS"; if(index.column() == PicaHelper::ColumnForMethodic::TasksLinks){ QString link = index.data(Qt::DisplayRole).toString(); return QDesktopServices::openUrl(QUrl(link)); } } return QStyledItemDelegate::editorEvent(event, model, option, index); } Я вот так переопределяю Планирую сделать так, чтобы при одиночном нажатии открывалась ссылка из столбца, а при двойном поле для редактирования ссылки
Если посмотреть example который можно также локально открыть в Qt Creator из меню, и потыкать его, то можно увидеть что оно фактически так и работает. Даблклик открывает редактор, просто клик - выделяет строку. Соответственно надо захендлить только нажатие клавиши. Клик обычно хэндлят именно по releaseEvent (можно в разном софте посмотреть, в случае с данной ситуацией - браузером). Если нужно хэндлить и то и другое, можно пойти простым путем, и создать отложенное действие с помощью QTimer. По первому клику мы его заводим на 100-200 мс, по ивенту даблклика мы его стопаем. Таким образом, если не последовал второй клик вслед за первым, выполнится действие по клику. А более сложный вариант - посидеть почитать документацию, и найти другое решение, более корректно переопределять ивенты, либо же глянуть в сторону insertWidget() в который можно вставить QLabel, который в свою очередь, поддерживает Rich Text и HTML разметку (соответственно, тег <a> тоже)
Обсуждают сегодня