Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: VAP от Января 19, 2010, 20:30



Название: Внешний вид курсора при наведении на гиперссылку, помещенную в QListWidgetItem.
Отправлено: 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);



Название: Re: Внешний вид курсора при наведении на гиперссылку, помещенную в QListWidgetItem.
Отправлено: crossly от Января 20, 2010, 13:38
думаю проблема здесь...
Код:
QPoint at = relativeToItem(event->pos());
    if(at.isNull())
       return;
попробуйте перед выходом... вернуть курсор на место...


Название: Re: Внешний вид курсора при наведении на гиперссылку, помещенную в QListWidgetItem.
Отправлено: VAP от Января 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 за помощь!


Название: Re: Внешний вид курсора при наведении на гиперссылку, помещенную в QListWidgetItem.
Отправлено: crossly от Января 21, 2010, 13:03
и правильно.... а если дочернее закрыть и походить снова по ссылкам... или по вьюхе... ??


Название: Re: Внешний вид курсора при наведении на гиперссылку, помещенную в QListWidgetItem.
Отправлено: VAP от Января 21, 2010, 18:13
После клика(отпускания) на ссылку в событии MouseReleaseEvent устанавливаю восстановление вида курсора и только после этого уже открываю дочернее окно диалога.
Кажется все проблемы решены.