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

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 ответов

50 просмотров

Подозреваю что строчка 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> тоже)

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

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

Добрый вечер, Пока не совсем понимаю как наладить общение между телеграм ботом и ПО для работы с сим боксом. По самому боту так понял: - Нужен некий баланс, который можно поп...
Magic
6
сделал сайт, прикрутил в боте сайт, и виджет логина. как автоматически логинить пользователя в аккаунт(телеграм), при входе с бота?
Александра Чернивецкая
5
Объясните, пожалуйста, почему компилятор ругается на использование в условии неинициализированной переменной: int x; Task.Run(async () => { x = await somefunc(); }).Wait...
Александр
5
Ребят, подскажите, пожалуйста, почему в префиксе к ассетам, которые генерируются через фильтр | theme в шаблоне, стал вдруг появляться index.php? Вот так выглядит ссылка на а...
Виталий
1
Всем привет. Ребята, подскажите, пожалуйста. у ботов есть ограничение на отправку сообщений - 30 сообщений в секунду, эти ограничения накладываются на все сообщения? или на со...
Artem Stormageddon
4
Блин, ребята, сори за тупые вопросы. А можно ли как-то открыть вебапку по нажатию на кнопку в меню(которое появляется слева, команды)?
Artem Stormageddon
3
а плаксы из-под питона умеют только в комфортных условиях что-то выдавить из себя?)
Lencore
9
Но, может, есть уже проверенная? Наши требования такие: 1. Сообщения должны приходить из Инста в CRM оду 2. Должна быть возможность подключить несколько экаунтов Инстаграм. Р...
Alexander Sharoiko MSE / Александр Шаройко
13
Это может быть все-таки не флудвейт? у меня ботфазер принимает изменения и отображает даже что они изменились, на видео видно что он прислал якобы уже измененное описание, н...
OVERLINK
13
Коллеги, может знает кто, можно ли цвет бейджа счётчика в BackendMenu менять без бубнов?
Alex Blaze
3
Карта сайта