Russian Qt Forum

Qt => Вопросы новичков => Тема начата: zagruzkaaa от Февраль 05, 2016, 21:45



Название: QAbstractItemDelegate
Отправлено: zagruzkaaa от Февраль 05, 2016, 21:45
Создал свой класс от QAbstractItemDelegate для рисования изображения в QTableView
Все нормально рисуется. Теперь вопрос: как сделать чтобы при наведении на изображении рисовался увеличенный вариант? или хотябы при нажатии на него?

Почему событие paint не вызывается когда я нажимаю на ячейку с картикой? но когда я пытаюсь прокрутить колесеко мышки оно тут же вызывается...


Название: Re: QAbstractItemDelegate
Отправлено: Racheengel от Февраль 06, 2016, 00:47
Потому что при нажатии перерисовки не происходит, а при скролле - да.
Для Вашей проблемы я бы сделал решение в виде отдельного окна, в котором бы рисовал превью.


Название: Re: QAbstractItemDelegate
Отправлено: zagruzkaaa от Февраль 06, 2016, 02:30
Потому что при нажатии перерисовки не происходит, а при скролле - да.
Для Вашей проблемы я бы сделал решение в виде отдельного окна, в котором бы рисовал превью.
у меня итак и при двойном клике выходит отдельное на весь экран окно с изображением)
а хотелось бы при наведении или нажатии видеть чуть больше чем изначально...


Название: Re: QAbstractItemDelegate
Отправлено: Igors от Февраль 06, 2016, 08:26
как сделать чтобы при наведении на изображении рисовался увеличенный вариант? или хотябы при нажатии на него?
1) Отслеживаете сами вход/выход из ячейки. Заводите переменную типа QPersistentModelIndex. Перекрываете viewportEvent и там заряжаете индекс и делаете viewport().update().
2) В делегате рисуете так или сяк в зависимости от сравнения пришедшего индекса с запомненным


Название: Re: QAbstractItemDelegate
Отправлено: zagruzkaaa от Февраль 07, 2016, 19:09
как сделать чтобы при наведении на изображении рисовался увеличенный вариант? или хотябы при нажатии на него?
1) Отслеживаете сами вход/выход из ячейки. Заводите переменную типа QPersistentModelIndex. Перекрываете viewportEvent и там заряжаете индекс и делаете viewport().update().
2) В делегате рисуете так или сяк в зависимости от сравнения пришедшего индекса с запомненным

Т.е это мне уже надо наследовать новый класс от QTableView ?


Название: Re: QAbstractItemDelegate
Отправлено: kambala от Февраль 07, 2016, 19:11
можно через фильтр событий вместо наследования


Название: Re: QAbstractItemDelegate
Отправлено: Igors от Февраль 08, 2016, 02:27
Т.е это мне уже надо наследовать новый класс от QTableView ?
Как уже сказали, можно через фильтр, только вешайте его на viewport() (а не на саму таблицу). Есть еще возможность QAbstractItemDelegate::helpEvent, но не уверен что она подойдет - вероятно будет срабатывать с задержкой


Название: Re: QAbstractItemDelegate
Отправлено: zagruzkaaa от Февраль 08, 2016, 17:31
Что делаю не так? Повесил фильтр
ui->tableView->viewport()->installEventFilter(this);
и сам фильтр
Код:
bool MainWindow::eventFilter(QObject *target, QEvent *event)
{
    qobject_cast<QWidget*>(target)->update();
    return QWidget::eventFilter(target, event);
}
Но делегат не перерисовывается...


Название: Re: QAbstractItemDelegate
Отправлено: gil9red от Февраль 08, 2016, 17:48
Что делаю не так? Повесил фильтр
ui->tableView->viewport()->installEventFilter(this);
и сам фильтр
Код:
bool MainWindow::eventFilter(QObject *target, QEvent *event)
{
    qobject_cast<QWidget*>(target)->update();
    return QWidget::eventFilter(target, event);
}
Но делегат не перерисовывается...

А точно нужно на всех событиях перерисовываться? Их бывает очень много...


Название: Re: QAbstractItemDelegate
Отправлено: zagruzkaaa от Февраль 08, 2016, 17:55
Что делаю не так? Повесил фильтр
ui->tableView->viewport()->installEventFilter(this);
и сам фильтр
Код:
bool MainWindow::eventFilter(QObject *target, QEvent *event)
{
    qobject_cast<QWidget*>(target)->update();
    return QWidget::eventFilter(target, event);
}
Но делегат не перерисовывается...

А точно нужно на всех событиях перерисовываться? Их бывает очень много...
сделал так для проверки просто. У меня вообще не перерисовывается) Зато как только покручу колесико мышки моментально перерисовывает


Название: Re: QAbstractItemDelegate
Отправлено: zagruzkaaa от Февраль 08, 2016, 18:27
Короче вроде сделал с помощью
QAbstractItemDelegate::helpEvent и QToolTip
Вроде все работает, но при первом наведении есть задержка секунды 2. Никто не вкурсе как убрать?)
И вообще нормальное решение задачи?)


Название: Re: QAbstractItemDelegate
Отправлено: VPS от Февраль 08, 2016, 22:26
Во вложении небольшой пример на Qt4 (с использованием делегата) увеличения шрифта текста ячейки QTableView при наведении курсора мыши.

P/S: есть минус - если размер ячейки меньше увеличенного текста, то часть его не будет видна.


Название: Re: QAbstractItemDelegate
Отправлено: zagruzkaaa от Февраль 09, 2016, 00:23
Во вложении небольшой пример на Qt4 (с использованием делегата) увеличения шрифта текста ячейки QTableView при наведении курсора мыши.

P/S: есть минус - если размер ячейки меньше увеличенного текста, то часть его не будет видна.
Блин, стоило мне добавить
ui->tableView->setMouseTracking(true);
и все заработало)


Название: Re: QAbstractItemDelegate
Отправлено: zagruzkaaa от Февраль 09, 2016, 21:20
Еще вопрос, в paint я рисую свое изображение но как теперь в методе sizeHint получить размер нарисованного изображения?


Название: Re: QAbstractItemDelegate
Отправлено: kambala от Февраль 09, 2016, 23:26
самому посчитать :)


Название: Re: QAbstractItemDelegate
Отправлено: zagruzkaaa от Февраль 09, 2016, 23:45
самому посчитать :)
если я делаю тоже самое что и в paint для получения Qpixmap, то в итоге все нормально, но работает раза в 20 дольше...


Название: Re: QAbstractItemDelegate
Отправлено: Bepec от Февраль 10, 2016, 00:16
Хранить текущий размер где нить.


Название: Re: QAbstractItemDelegate
Отправлено: zagruzkaaa от Февраль 10, 2016, 00:29
Хранить текущий размер где нить.
Но это же const методы... ?


Название: Re: QAbstractItemDelegate
Отправлено: kambala от Февраль 10, 2016, 01:02
ну данные ж явно известны до вызова paint, там и вычислить размер


Название: Re: QAbstractItemDelegate
Отправлено: Bepec от Февраль 10, 2016, 01:31
На каждый const мы напишем свой mutable.

Хаки мб и осуждаются программистами, мб и вызовут смех более опытных людей, но сэкономят кучу времени и иногда без них никак :)

Сам столкнулся с проблемой делегата константного, думал часа три, и так и эдак пытался. В принципе решил отдельный класс, хранящий данные и высчитывающий их самостоятельно, отдающий их по запросу.

PS но с той же эффективностью работает mutable переменная :D

PPS интересно в меня плюнут или нет? :P