Russian Qt Forum
Сентября 07, 2025, 10:53 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Внешний вид курсора при наведении на гиперссылку, помещенную в QListWidgetItem.  (Прочитано 5630 раз)
VAP
Гость
« : Января 19, 2010, 20:30 »

Доброго времени суток!
Есть класс, наследник QListWidget, в котором мне нужно отражать item(ы) (QListWidgetItem), содержащие гипертекстовые ссылки. Для класса установлено свойство:
setMouseTracking(true);
отлавливаю событие мыши mouseMoveEvent  и при позиционировании мыши на гиперссылку получаю изменение вида курсора (Qt::PointingHandCursor). Проблема заключается в следующем: при перетаскивании мыши ниже(по вертикали) последнего, отображаемого  item(а),  курсор не меняет свой вид в первоначальный. На item(ах), которые размещены выше - все нормально, по горизонтали тоже все нормально. Не могу разобраться в чем может быть проблема? Код ниже:
Код:
FilterView::FilterView(QWidget *parent)
    : QListWidget(parent)
{
    setMouseTracking(true);
 
}
void FilterView::mouseMoveEvent(QMouseEvent *event)
{
    QPoint at = relativeToItem(event->pos());
    if(at.isNull())
       return;
   
    QListWidgetItem *item = static_cast<QListWidgetItem*> (indexAt(event->pos()).internalPointer());
    QTextDocument doc;
    doc.setHtml(item->text());
    if (doc.documentLayout()->anchorAt(at).isEmpty()) {
        QApplication::restoreOverrideCursor();
    } else {
QCursor *c = QApplication::overrideCursor();
if (!c) {
    QApplication::setOverrideCursor(QCursor(Qt::PointingHandCursor));
}
    }
}

QPoint FilterView::relativeToItem(const QPoint &p) const
{
    QModelIndex idx = indexAt(p);
    if (!idx.isValid())
        return QPoint();

    return QPoint(p.x() - visualRect(idx).x(),  p.y() - visualRect(idx).y());
}
Добавляю item(ы):
Код:
QListWidgetItem *newItem = new QListWidgetItem(filterView);
QString emptyLink = QString("<a href=\"link\">%1</a>").arg(tr("[...]"));
newItem->setText(emptyLink);

Записан
crossly
Гость
« Ответ #1 : Января 20, 2010, 13:38 »

думаю проблема здесь...
Код:
QPoint at = relativeToItem(event->pos());
    if(at.isNull())
       return;
попробуйте перед выходом... вернуть курсор на место...
Записан
VAP
Гость
« Ответ #2 : Января 21, 2010, 00:13 »

Решил проблему так:
Код:
void FilterView::mouseMoveEvent(QMouseEvent *event) 
{
    QPoint at = relativeToItem(event->pos());
   
    if (itemAt(event->pos())) {   
        QListWidgetItem *item = static_cast<QListWidgetItem*> (indexAt(event->pos()).internalPointer());     
        QTextDocument doc;
        doc.setHtml(item->text());
        if (doc.documentLayout()->anchorAt(at).isEmpty()) {
            QApplication::restoreOverrideCursor();
        } else {
    QCursor *c = QApplication::overrideCursor();
    if (!c) {
        QApplication::setOverrideCursor(QCursor(Qt::PointingHandCursor));
    }
        }
    } else {
        QApplication::restoreOverrideCursor();
    }
}
Но появилась проблема другого плана, после клика на ссылку и открытии дочернего окна курсор остается вида HandCursor.

Спасибо crossly за помощь!
Записан
crossly
Гость
« Ответ #3 : Января 21, 2010, 13:03 »

и правильно.... а если дочернее закрыть и походить снова по ссылкам... или по вьюхе... ??
Записан
VAP
Гость
« Ответ #4 : Января 21, 2010, 18:13 »

После клика(отпускания) на ссылку в событии MouseReleaseEvent устанавливаю восстановление вида курсора и только после этого уже открываю дочернее окно диалога.
Кажется все проблемы решены.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.031 секунд. Запросов: 21.