Russian Qt Forum

Qt => Model-View (MV) => Тема начата: TaIRou от Октябрь 18, 2011, 21:04



Название: QTableView, обработка QEvent::StatusTip
Отправлено: TaIRou от Октябрь 18, 2011, 21:04
Доброго времени суток, ребят.
Вот, например, мы используем QStandardItem, а точнее его метод
Код:
void QStandardItem::setStatusTip ( const QString & statusTip )
Вопрос, каким образом view реагирует на данные Qt::StatusTipRole, которые находятся в модели.
Делал фильтр событий для QTableView
Код:
bool
Myfilter::eventFilter(QObject *watched, QEvent *event)
{
    if (event->type() == QEvent::StatusTip)
        qDebug() << "Myfilter::eventFilter" << event->type();
    if (event->type() == QEvent::ToolTip)
        qDebug() << "Myfilter::eventFilter" << event->type();

    return false;
}
Но ему пофиг на то, что происходит с QTableView. Как будто и событий никаких она не обрабатывает. Может она их сама генерирует поэтому и фильтр ничег не ловит?
Мне необходимо каким-нибудь волшебным образом, отлавливать события связанные со StatusTip item'ов, если таковые вообще есть или придется наследоваться от вьюшки и генерировать события самому?


Название: Re: QTableView, обработка QEvent::StatusTip
Отправлено: twp от Октябрь 20, 2011, 15:20
а что будет, если повесить фильтр на вьюпорт?


Название: Re: QTableView, обработка QEvent::StatusTip
Отправлено: TaIRou от Октябрь 20, 2011, 19:03
а что будет, если повесить фильтр на вьюпорт?

спасибо за ответ, но Qt-шники и так свой фильтр на вьюпорт повесили и через его eventFilter(QEvent *) виртуальную viewportEvent(QEvent *) вызывают.
Они сами генерят событие StatusTip, только вот в каком случае, я не стал разбираться, голову сломаю)
Может для viewport'a необходимо setMouseTracking(true) сделать...

Код:
void QAbstractItemView::mouseMoveEvent(QMouseEvent *event)
...
QPoint bottomRight = event->pos();
...
QModelIndex index = indexAt(bottomRight);
....
if (d->enteredIndex != index) {
        // signal handlers may change the model
        QPersistentModelIndex persistent = index;
        if (persistent.isValid()) {
            emit entered(persistent);
#ifndef QT_NO_STATUSTIP
            QString statustip = d->model->data(persistent, Qt::StatusTipRole).toString();
            if (parent() && !statustip.isEmpty()) {
                QStatusTipEvent tip(statustip);
                QApplication::sendEvent(parent(), &tip);
            }
#endif
        } else {
#ifndef QT_NO_STATUSTIP
            if (parent()) {
                QString emptyString;
                QStatusTipEvent tip(emptyString);
                QApplication::sendEvent(parent(), &tip);
            }
#endif
            emit viewportEntered();
        }

Я думал, что логика такая же как и у обычного QWidget'a: при входе в границы ячейки и выходе из них генерится событие QStatusTip, но вроде все не так... Если у кого есть желание загляните в исходники QAbstractItemView, может у вас будут свежие мысли)))