Гопчат сформировал вот это

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;

9 ответов

12 просмотров

Подозреваю что строчка opt.widget->style()->drawControl(QStyle::CE_ItemViewItem, &opt2, painter, opt2.widget); - лишняя

Александр-Серый Автор вопроса
TheDoctor
Подозреваю что строчка opt.widget->style()->drawCo...

В итоге я с этим не разобрался и сделал иначе Уже работает, разбираюсь с QEvent и обработкой нажатий)

Александр-Серый Автор вопроса
TheDoctor
Подозреваю что строчка opt.widget->style()->drawCo...

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

Александр Серый
Теперь хочется обрабатывать двойное и одиночное на...

https://doc.qt.io/qt-6/qwidget.html#mouseDoubleClickEvent смотри в эту сторону и переопределяй соответствующие методы ивент хэндлеров

Александр-Серый Автор вопроса
TheDoctor
https://doc.qt.io/qt-6/qwidget.html#mouseDoubleCli...

Не, это знаю Мне в делегате переопределить надо

Александр-Серый Автор вопроса
TheDoctor
https://doc.qt.io/qt-6/qwidget.html#mouseDoubleCli...

Вопрос просто в том, как отлавливается двойное нажатие мыши, если перед этим выполняются сначала QEvent::MouseButtonPress, затем QEvent::MouseButtonRelease и только потом двойное

Насколько я помню, делегат не занимается генерацией и обработкой ивентов, его задача отрисовать элемент и/или редактор виджет для элемента, но не переопределять поведения при событии

Александр-Серый Автор вопроса
TheDoctor
Насколько я помню, делегат не занимается генерацие...

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); } Я вот так переопределяю Планирую сделать так, чтобы при одиночном нажатии открывалась ссылка из столбца, а при двойном поле для редактирования ссылки

Александр Серый
bool TreeViewItemDelegate::editorEvent(QEvent *eve...

Если посмотреть example который можно также локально открыть в Qt Creator из меню, и потыкать его, то можно увидеть что оно фактически так и работает. Даблклик открывает редактор, просто клик - выделяет строку. Соответственно надо захендлить только нажатие клавиши. Клик обычно хэндлят именно по releaseEvent (можно в разном софте посмотреть, в случае с данной ситуацией - браузером). Если нужно хэндлить и то и другое, можно пойти простым путем, и создать отложенное действие с помощью QTimer. По первому клику мы его заводим на 100-200 мс, по ивенту даблклика мы его стопаем. Таким образом, если не последовал второй клик вслед за первым, выполнится действие по клику. А более сложный вариант - посидеть почитать документацию, и найти другое решение, более корректно переопределять ивенты, либо же глянуть в сторону insertWidget() в который можно вставить QLabel, который в свою очередь, поддерживает Rich Text и HTML разметку (соответственно, тег <a> тоже)

Похожие вопросы

Обсуждают сегодня

Я колись ставив гуглу антиспам 3.0, може і норм, але мені не дуже зайшло. Теж думав тиждень, що його і куди. Зупинився на трех варіантах відразу всі три і включив 1. Перевір...
𝓔𝓾𝓰𝓮𝓷𝓮𝓥 J
2
Портфолио: Зовут меня Александр, мне 36 лет. Город Пушкино. Общий рабочий стаж: ~14 лет Уровень квалификации: Senior Full-stack developer Где прочесть мой код? https://github....
Magic
10
Всем привет, может уже кто-то пытался выдернуть из api информацию о дате рождения пользователя Есть ли вообще такая возможность?
Artem Stormageddon
2
Приветствую всех, возникла проблема, до этого писал бота в простом формате где при выполнении условий приходило через send_message информация, сейчас решил добавить хендлер на...
Andrew
4
Портфолио: Зовут меня Александр, мне 41 год. Город Киров. Общий рабочий стаж: ~14 лет Уровень квалификации: Senior Full-stack developer Где прочесть мой код? https://github.co...
Magic
11
где собака, админ группы? нычкуется и боится проявить волю, в толерантность еще не наигрался? @yelizariev
Ognezar
61
Приветствую всех, есть вопросик. Передали проект на OctoberCms, без инсталяшки в полуразвернутом виде, нужно было залить бекап бд, после залития бд, оказалось, что части строк...
Лео
14
Можно ли отследить отправление местоположения именно по кнопке, чтобы 100% отправлялось текущее, а не любое выбранное?
Lencore
2
Ребят, привет. У кого-то есть опыт заказа мерча в сторе? Есть успешные кейсы? Чёт у меня турецкую карту не принимает
Vladimir F.
7
Ребят, привет. А эти формы как отправлять? У меня на странице контактов форма, мне нужно ее на почту к себе скидывать. Я уже не не помню где и как это делалось? Может кто-нибу...
Atid Kitdeveloper.ru
2
Карта сайта