Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Qt] QPainter проблема, Рисование на QScrollArea 
V
    Опции темы
Annihilator
Дата 15.1.2010, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


bytegrinder
**


Профиль
Группа: Участник
Сообщений: 493
Регистрация: 21.11.2006
Где: Омск

Репутация: нет
Всего: 3



Есть виджет, унаследованный от QScrollArea. Переопределил на нем события мыши, ловлю клики, пишу координаты клика в QVector<QPoint> (клики пишутся, координаты отображаются в списке)

Подскажите плиз, как сделать, чтобы по каждому клику на ScrollArea рисовались точки там, где кликнешь.
Что-то типа:
Код

void QACScrollArea::paintEvent(QPaintEvent *)
{
    QPainter scrollAreaPainter(this);
    scrollAreaPainter.begin(this);
    scrollAreaPainter.setPen(QPen(Qt::red, 13));
    scrollAreaPainter.save();

    for(QVector<QPoint>::iterator it = points.begin(); it!=points.end(); ++it)
        scrollAreaPainter.drawPoint(*it);
    scrollAreaPainter.end();
}


как его так вызвать каждый раз из mousePressEvent, чтобы тут же все перерисовалось.


--------------------
Если вы не можете сделать хоpошyю пpогpаммy, сделайте, чтобы она по кpайней меpе выглядела хоpошо
PM ICQ   Вверх
SABROG
Дата 15.1.2010, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



update()/repaint()


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
Annihilator
Дата 15.1.2010, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


bytegrinder
**


Профиль
Группа: Участник
Сообщений: 493
Регистрация: 21.11.2006
Где: Омск

Репутация: нет
Всего: 3



Цитата(SABROG @  15.1.2010,  22:16 Найти цитируемый пост)
update()/repaint() 

Пробовал. Вставлял вызова в обработчки мыши, но ни то ни другое не побуждает событие перерисовки. Если надо могу проект кинуть. Там немного)


--------------------
Если вы не можете сделать хоpошyю пpогpаммy, сделайте, чтобы она по кpайней меpе выглядела хоpошо
PM ICQ   Вверх
ecspertiza
Дата 15.1.2010, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 3.11.2008
Где: г.Смоленск

Репутация: 4
Всего: 5



Лудще, не проект а минимальный пример, и если я не ошибаюсь рисовать лудше не на QScrollArea ,а на виджете который находится внутри нее , ибо у арены ширина и высота всегда одинаковые а у виджета внутри нее могут меняться.


--------------------
С уважением,
мастер конфетного цеха!

онлайн компилер
залип
PM MAIL   Вверх
Annihilator
Дата 15.1.2010, 21:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


bytegrinder
**


Профиль
Группа: Участник
Сообщений: 493
Регистрация: 21.11.2006
Где: Омск

Репутация: нет
Всего: 3



Цитата(ecspertiza @  15.1.2010,  23:34 Найти цитируемый пост)
Лудще, не проект а минимальный пример, и если я не ошибаюсь рисовать лудше не на QScrollArea ,а на виджете который находится внутри нее , ибо у арены ширина и высота всегда одинаковые а у виджета внутри нее могут меняться. 

Т.е. допустим помещаю я свой виджет в QSrollArea, на виджет гружу большую картинку и появится автоскролл (если виджет увеличить до размеров загружаемой картинки)


--------------------
Если вы не можете сделать хоpошyю пpогpаммy, сделайте, чтобы она по кpайней меpе выглядела хоpошо
PM ICQ   Вверх
ecspertiza
Дата 15.1.2010, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 3.11.2008
Где: г.Смоленск

Репутация: 4
Всего: 5



ну по ходу QScrollArea и должен так работать, если я не ошибаюсь))))


--------------------
С уважением,
мастер конфетного цеха!

онлайн компилер
залип
PM MAIL   Вверх
null56
Дата 16.1.2010, 04:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 6
Всего: 12



Annihilator, я написал тебе пример с одной точкой
Цитата

Note: If you open a painter, make sure to open it on the viewport().

scrollarea.h
Код

#ifndef SCROLLAREA_H
#define SCROLLAREA_H

#include <QScrollArea>
#include <QMouseEvent>
#include <QPainter>
#include <QPoint>

class ScrollArea : public QScrollArea
{
public:
    /** конструктор */
    ScrollArea(QWidget * pParent = 0);

protected:
    /** перерисовка виджета */
    void paintEvent(QPaintEvent *event);
    /** нажатие клавиши мыши */
    void mousePressEvent ( QMouseEvent * e );

private:
    QPoint m_Coords; /**< координаты кликанья */
    QPainter m_Painter; /**< рисовальщик точек */
};

#endif // SCROLLAREA_H

scrollarea.cpp
Код

#include "scrollarea.h"

/** конструктор */
ScrollArea::ScrollArea(QWidget * pParent) :
    QScrollArea(pParent),
    m_Coords(0, 0)
{

}

/** перерисовка виджета */
void
ScrollArea::paintEvent(QPaintEvent *event)
{
    qDebug("paintEvent");
    QWidget :: paintEvent(event);
    // очистим экран
    m_Painter.begin(viewport());
    m_Painter.setPen(QPen(Qt :: black, 5, Qt::SolidLine));
    m_Painter.setBrush(Qt :: white);
    m_Painter.drawRect(0, 0, viewport()->width(), viewport()->height());
    // отрисуем точку на экране
    m_Painter.drawPoint(m_Coords);
    m_Painter.end();
}

/** нажатие клавиши мыши */
void
ScrollArea::mousePressEvent ( QMouseEvent * e )
{
    qDebug("mousePressEvent");
    // проверка на нажатие левой клавиши мыши
    if (e->button() == Qt::LeftButton)
    {
        qDebug("Left button x = %d, y = %d", e->x(), e->y());
        m_Coords = QPoint(e->x(), e->y());
        viewport()->repaint();
    }
}

Под много точек, я думаю ты и сам заточишь задачу

Это сообщение отредактировал(а) null56 - 16.1.2010, 05:01
PM MAIL   Вверх
Annihilator
Дата 17.1.2010, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


bytegrinder
**


Профиль
Группа: Участник
Сообщений: 493
Регистрация: 21.11.2006
Где: Омск

Репутация: нет
Всего: 3



null56, кстати а твоя ScrollArea скроллит когда надо? У меня нет. И setWidget почему-то не работает. Добавляет только со слоем

Это сообщение отредактировал(а) Annihilator - 17.1.2010, 19:34


--------------------
Если вы не можете сделать хоpошyю пpогpаммy, сделайте, чтобы она по кpайней меpе выглядела хоpошо
PM ICQ   Вверх
null56
Дата 17.1.2010, 23:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 6
Всего: 12



Сама нет, да я и не уверен, что с рисунком она автоматом будет это делать. Я в своем проекте сам изменял размеры viewport, если не ошибаюсь и тогда scrollarea уже начинала скролиться или хранил участки рисунка в памяти, не помню, отрисовывая их на виджете в зависимости от расположения скролла

Цитата(Annihilator @  17.1.2010,  19:34 Найти цитируемый пост)
И setWidget почему-то не работает. Добавляет только со слоем

вот тут я не совсем понял, что ты имел в виду "слоями"?
ты пробовал пример из ассистента?
Код

 QLabel *imageLabel = new QLabel;
 QImage image("happyguy.png");
 imageLabel->setPixmap(QPixmap::fromImage(image));

 scrollArea = new QScrollArea;
 scrollArea->setBackgroundRole(QPalette::Dark);
 scrollArea->setWidget(imageLabel);

PM MAIL   Вверх
Annihilator
Дата 18.1.2010, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


bytegrinder
**


Профиль
Группа: Участник
Сообщений: 493
Регистрация: 21.11.2006
Где: Омск

Репутация: нет
Всего: 3



Цитата(null56 @  18.1.2010,  03:01 Найти цитируемый пост)
вот тут я не совсем понял, что ты имел в виду "слоями"?

я имел ввиду, если создавать слой, допустим qvboxlayout, добавлять в него виджеты методом addWidget(), и потом цеплять этот слой в скролларии.

Цитата(null56 @  18.1.2010,  03:01 Найти цитируемый пост)
ты пробовал пример из ассистента?

Да. Но там используются стандартные а не субклассированные контролы (лейбл - в моем случае). Вот я и думаю, может что-то недоперегрузил когда наследовал лейбл


--------------------
Если вы не можете сделать хоpошyю пpогpаммy, сделайте, чтобы она по кpайней меpе выглядела хоpошо
PM ICQ   Вверх
null56
Дата 18.1.2010, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 6
Всего: 12



У тебя то есть пример из ассистента работал, но ты унаследовал и у тебя не пашет?
скинь примерчик
PM MAIL   Вверх
Annihilator
Дата 18.1.2010, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


bytegrinder
**


Профиль
Группа: Участник
Сообщений: 493
Регистрация: 21.11.2006
Где: Омск

Репутация: нет
Всего: 3



Цитата(null56 @  18.1.2010,  15:44 Найти цитируемый пост)
У тебя то есть пример из ассистента работал, но ты унаследовал и у тебя не пашет?
скинь примерчик 

Беру свои слова обратно. Заработало)

Это сообщение отредактировал(а) Annihilator - 18.1.2010, 21:07


--------------------
Если вы не можете сделать хоpошyю пpогpаммy, сделайте, чтобы она по кpайней меpе выглядела хоpошо
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0512 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.