Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
Заблокирован

Пропадают линии при ZoomIn в QGraphicsView

09.09.2014, 16:53. Показов 2716. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Почему - то пропадают нарисованные линии (QGraphicsScene -> addLine), когда при ZoomIn появляются тулбары по бокам, то есть получается когда сцена больше QGraphicsView... Бывало у кого - то такое ? Может знаете как с этим бороться ? Функцию update у сцены и у QGraphicsView когда целесообразно вызывать, если линии свои я могу мышкой двигать по сцене ?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.09.2014, 16:53
Ответы с готовыми решениями:

Верхние линии пропадают при выводе
Всем привет! Ничего не нашёл нигде по теме. Вот в чём проблема: пишу программу для универа на паскале, использую lazarus. Когда делаю run,...

Пропадают линии
Рисую линии glDisableClientState(GL_COLOR_ARRAY); glColor3ub(0x80,0x80,0x80); for (Trace::const_iterator...

Почему в средстве разработчика пропадают линии на форме
Почему в средстве разработчика пропадают линии на форме?

9
Поклонник Qt
 Аватар для CriDos
314 / 210 / 41
Регистрация: 09.11.2013
Сообщений: 336
Записей в блоге: 1
09.09.2014, 17:53
Цитата Сообщение от Scrooge McDuck Посмотреть сообщение
Может знаете как с этим бороться ?
Попробуйте поэкспериментировать с QGraphicsView::setViewportUpdateMode

Добавлено через 1 минуту
Цитата Сообщение от Scrooge McDuck Посмотреть сообщение
Функцию update у сцены и у QGraphicsView когда целесообразно вызывать, если линии свои я могу мышкой двигать по сцене ?
Вьювер сам обновляет область видимости (viewport), когда требуется.
0
Заблокирован
09.09.2014, 19:12  [ТС]
Цитата Сообщение от CriDos Посмотреть сообщение
Попробуйте поэкспериментировать
Не помогает
Цитата Сообщение от CriDos Посмотреть сообщение
Вьювер сам обновляет область видимости (viewport), когда требуется.
Так - то оно - так, но вот если я унаследовал класс от QGraphicsItem и переопределил в нём paint, то вьювер уже не будет знать, когда какая -то внутренняя геометрия в моем классе поменялась и не будет знать, когда что перерисовать. Банально, в моём классе от QGraphicsItem рисуется смешная рожица Микимауса, по определённой команде эта рожица должна подмигнуть зрителю, я своими силами внутри этого класса сам меняю координаты геометрии и вот как теперь мне сказать вьюверу, что что - то изменилось? Я думал просто update() вызывать в сцене да и всё, но это не всегда срабатывает. Да и потом, при ZoomIn всё равно всё пропадает

Добавлено через 1 час 11 минут
У меня появились сомнения на счёт самой процедуры в унаследованном от QGraphicsItem классе paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget), а так же по поводу второй необходимой для переопределения функции boundingRect()

Во - первых, подскажите пожалуйста, в boundingRect() я обязательно должен возвращать описывающий всю мою геометрию прямоугольник или же, если я сам из вне не использую этот boundingRect(), То он мне и не нужен и я могу возвращать "пустышку" типа return QRectF(); ? Сейчас я возвращаю пустышку и возможно из - за этого у меня порой линии исчезают ?

Во - вторых, в процедуру paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) передаются опции в QStyleOptionGraphicsItem, среди которых есть и levelOfDetail, на сколько я понимаю, это грубо говоря коэффициент масштабирования (scaleв QGraphicsView), а собственно что мне с ним делать? Мне нужно всю свою геометрию так же масштабировать вслед за этим коэффициентом что - ли ?
0
Поклонник Qt
 Аватар для CriDos
314 / 210 / 41
Регистрация: 09.11.2013
Сообщений: 336
Записей в блоге: 1
09.09.2014, 20:04
Цитата Сообщение от Scrooge McDuck Посмотреть сообщение
я обязательно должен возвращать описывающий всю мою геометрию прямоугольник
Обязательно, т.к. вьювер по этой области определяет, какую часть видимой области ему нужно обновить.
Ну и для взаимодействия с данным объектом, так-же необходимо задавать корректные параметры объекта.

Можно воспользоваться QGraphicsRectItem, и лишь указывать размеры прямоугольника и рисовать в нём, всё остальное он посчитает сам.

Добавлено через 10 минут
Цитата Сообщение от Scrooge McDuck Посмотреть сообщение
levelOfDetail
Это устаревший член класса, его рекомендуется заменить на QStyleOptionGraphicsItem::levelOfDetailF romTransform.
В качестве результата, возвращается уровень детализации исходя из указанной трансформации.
qreal QStyleOptionGraphicsItem::levelOfDetailF romTransform ( const QTransform & worldTransform ) [static]

Returns the level of detail from the worldTransform.

Its value represents the maximum value of the height and width of a unity rectangle, mapped using the worldTransform of the painter used to draw the item. By default, if no transformations are applied, its value is 1. If zoomed out 1:2, the level of detail will be 0.5, and if zoomed in 2:1, its value is 2.

This function was introduced in Qt 4.6.
1
Заблокирован
09.09.2014, 20:38  [ТС]
Цитата Сообщение от CriDos Посмотреть сообщение
Ну и для взаимодействия с данным объектом, так-же необходимо задавать корректные параметры объекта.
А какие ещё могут быть параметры, кроме описывающего прямоугольника ?

Цитата Сообщение от CriDos Посмотреть сообщение
В качестве результата, возвращается уровень детализации исходя из указанной трансформации.
Ну это я знал, вопрос в другом, нужно ли мне этот LOD как - то задействовать ? Обязан ли я в соответствие с ним отмасштабировать свою внутреннюю геометрию MyClass : public QGraphicsItem - а ?
0
Поклонник Qt
 Аватар для CriDos
314 / 210 / 41
Регистрация: 09.11.2013
Сообщений: 336
Записей в блоге: 1
09.09.2014, 21:18
Цитата Сообщение от Scrooge McDuck Посмотреть сообщение
Обязан ли я в соответствие с ним отмасштабировать свою внутреннюю геометрию MyClass : public QGraphicsItem - а ?
Нет, этим всем занимается вьювер.
И даже то что Вы нарисовали QPainter'ом, попадает под общую трансформацию, если не указано обратное в конкретном Item'e.

Цитата Сообщение от Scrooge McDuck Посмотреть сообщение
А какие ещё могут быть параметры, кроме описывающего прямоугольника ?
Ну, в данном случае, достаточно указать setRect() и рисовать в пределах указанного прямоугольника.
В случае нестандартных решениях, пользоваться остальными методами и свойствами: List of All Members for QGraphicsRectItem
0
Заблокирован
09.09.2014, 21:23  [ТС]
Цитата Сообщение от CriDos Посмотреть сообщение
Нет, этим всем занимается вьювер.
А зачем же он мне тогда коэффициент масштаба присылает, если он всё сам делает ?

Цитата Сообщение от CriDos Посмотреть сообщение
В случае нестандартных решениях, пользоваться остальными методами и свойствами: List of All Members for QGraphicsRectItem
Кроме rect больше параметров то и нет
Цитата Сообщение от CriDos Посмотреть сообщение
Ну, в данном случае, достаточно указать setRect()
Не верно. В данном случае следует обязательно переопределить функцию boundingRect(), в которой и возвращать нужный rect. Собственно этой функцией - то и пользуются все остальные.
0
Поклонник Qt
 Аватар для CriDos
314 / 210 / 41
Регистрация: 09.11.2013
Сообщений: 336
Записей в блоге: 1
09.09.2014, 21:35
Цитата Сообщение от Scrooge McDuck Посмотреть сообщение
Не верно. В данном случае следует обязательно переопределить функцию boundingRect(), в которой и возвращать нужный rect. Собственно этой функцией - то и пользуются все остальные.
Ну, я имел ввиду класс QGraphicsRectItem.

Цитата Сообщение от Scrooge McDuck Посмотреть сообщение
А зачем же он мне тогда коэффициент масштаба присылает, если он всё сам делает ?
Дабы можно было реагировать на определённый масштаб например

Добавлено через 2 минуты
Посмотри пример Qt5.3.1\Examples\Qt-5.3\widgets\graphicsview\chip, там очень наглядно показан пример использования lod'a.
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
void Chip::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    Q_UNUSED(widget);
 
    QColor fillColor = (option->state & QStyle::State_Selected) ? color.dark(150) : color;
    if (option->state & QStyle::State_MouseOver)
        fillColor = fillColor.light(125);
 
    const qreal lod = option->levelOfDetailFromTransform(painter->worldTransform());
    if (lod < 0.2) {
        if (lod < 0.125) {
            painter->fillRect(QRectF(0, 0, 110, 70), fillColor);
            return;
        }
 
        QBrush b = painter->brush();
        painter->setBrush(fillColor);
        painter->drawRect(13, 13, 97, 57);
        painter->setBrush(b);
        return;
    }
 
    QPen oldPen = painter->pen();
    QPen pen = oldPen;
    int width = 0;
    if (option->state & QStyle::State_Selected)
        width += 2;
 
    pen.setWidth(width);
    QBrush b = painter->brush();
    painter->setBrush(QBrush(fillColor.dark(option->state & QStyle::State_Sunken ? 120 : 100)));
 
    painter->drawRect(QRect(14, 14, 79, 39));
    painter->setBrush(b);
 
    if (lod >= 1) {
        painter->setPen(QPen(Qt::gray, 1));
        painter->drawLine(15, 54, 94, 54);
        painter->drawLine(94, 53, 94, 15);
        painter->setPen(QPen(Qt::black, 0));
    }
 
    // Draw text
    if (lod >= 2) {
        QFont font("Times", 10);
        font.setStyleStrategy(QFont::ForceOutline);
        painter->setFont(font);
        painter->save();
        painter->scale(0.1, 0.1);
        painter->drawText(170, 180, QString("Model: VSC-2000 (Very Small Chip) at %1x%2").arg(x).arg(y));
        painter->drawText(170, 200, QString("Serial number: DLWR-WEER-123L-ZZ33-SDSJ"));
        painter->drawText(170, 220, QString("Manufacturer: Chip Manufacturer"));
        painter->restore();
    }
 
    // Draw lines
    QVarLengthArray<QLineF, 36> lines;
    if (lod >= 0.5) {
        for (int i = 0; i <= 10; i += (lod > 0.5 ? 1 : 2)) {
            lines.append(QLineF(18 + 7 * i, 13, 18 + 7 * i, 5));
            lines.append(QLineF(18 + 7 * i, 54, 18 + 7 * i, 62));
        }
        for (int i = 0; i <= 6; i += (lod > 0.5 ? 1 : 2)) {
            lines.append(QLineF(5, 18 + i * 5, 13, 18 + i * 5));
            lines.append(QLineF(94, 18 + i * 5, 102, 18 + i * 5));
        }
    }
    if (lod >= 0.4) {
        const QLineF lineData[] = {
            QLineF(25, 35, 35, 35),
            QLineF(35, 30, 35, 40),
            QLineF(35, 30, 45, 35),
            QLineF(35, 40, 45, 35),
            QLineF(45, 30, 45, 40),
            QLineF(45, 35, 55, 35)
        };
        lines.append(lineData, 6);
    }
    painter->drawLines(lines.data(), lines.size());
 
    // Draw red ink
    if (stuff.size() > 1) {
        QPen p = painter->pen();
        painter->setPen(QPen(Qt::red, 1, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin));
        painter->setBrush(Qt::NoBrush);
        QPainterPath path;
        path.moveTo(stuff.first());
        for (int i = 1; i < stuff.size(); ++i)
            path.lineTo(stuff.at(i));
        painter->drawPath(path);
        painter->setPen(p);
    }
}
0
Заблокирован
09.09.2014, 21:48  [ТС]
Цитата Сообщение от CriDos Посмотреть сообщение
Дабы можно было реагировать на определённый масштаб например
Ну в принципе согласен, для чего - то может пригодиться.

Цитата Сообщение от CriDos Посмотреть сообщение
Ну, я имел ввиду класс QGraphicsRectItem.
А, ну так - то да. Кстати, а в какой готовый QGraphicsЧТО-ТОIem можно обернуть polyline (набор сочленённых прямых линий) ? Пока что мне кажется, что нужно в простой QGraphicsItem или же QGraphicsRectItem, т.к. какая бы линия не была, всё равно она же прямоугольником отбаундаривается, т.к. скорее всего даже QGraphicsPolygonItem-ы работают по такому же принципе, так же ?
0
Поклонник Qt
 Аватар для CriDos
314 / 210 / 41
Регистрация: 09.11.2013
Сообщений: 336
Записей в блоге: 1
09.09.2014, 22:01
Цитата Сообщение от Scrooge McDuck Посмотреть сообщение
т.к. какая бы линия не была, всё равно она же прямоугольником отбаундаривается
Так то да, но в зависимости от класса, например QGraphicsEllipseItem, при взаимодействии с ним (hoverEnterEvent) учитывается специфика геометрии, и при проведении мыши по краю овала, событие не будет отправлено.
Но на 100% я не уверен в данном утверждении, лишь наблюдение на основе своего проекта.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.09.2014, 22:01
Помогаю со студенческими работами здесь

ZoomIn и ZoomOut в QPlainTextEdit
Как можно приблизить текст в QPlainTextEdit ??? Есть ли какая-нибудь альтернатива приближению и отдалению как в QTextEdit ?

Мерцание при отрисовке объектов на QGraphicsView
Здравствуйте! Делаю арканоид и возникла проблема, суть которой можно понять из прикрепленного рисунка. На скринах этого не видно, а...

При клике на QGraphicsView вывести диалоговое окно ввода переменной
Есть элемент QGraphicsView: key = scene-&gt;addLine(175,-100,190,-105,blackpen); key-&gt;setFlag(QGraphicsLineItem::ItemIsSelectable); ...

Как сохранить размер элементов на сцене при изменении размеров на QGraphicsView?
Добавляю несколько эллипсов на сцену, а потом увеличиваю через scale на GraphicsView, но оно увеличивает и сами эллипсы. Как можно...

Как совместить два эффекта (zoomIn и zoomOut) в одном
Есть вот такой вот код - animated infinite zoomIn, позволяющий элементу зациклено всплывать (с помощью эффекта zoomIn), а потом снова...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru