Russian Qt Forum
Сентябрь 30, 2024, 16:18 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Смена изображения  (Прочитано 6183 раз)
Den2009
Гость
« : Сентябрь 14, 2010, 20:29 »

суть такая: на виджете рисуется объект, сверху подписывается с помощью drawText что там нарисовано.
через некоторое время дорисовывается другой объект и надпись должна измениться
в общем 2 проблемы:
как реализовать задержку (типа delay)?
у меня есть мысль сделать так:
Код:
    QTime t;
    t.start();
    if (t.elapsed() > 300)
    {
тут описывается рисование другого объекта
    }
но, т.к. таких дорисовываний будет много, то и циклов придется делать много, что не очень хорошо

и 2-я проблема (вариант решения пока что не придумал): как стереть старую надпись? поиск ничего вразумительного не дал
Записан
kibsoft
Хакер
*****
Offline Offline

Сообщений: 625


Просмотр профиля WWW
« Ответ #1 : Сентябрь 14, 2010, 22:17 »

Цитировать
как стереть старую надпись?
Может быть как-то поможет save() и restore() у QPainter..
Записан

http://kibsoft.ru - Download the Qt Media Encoding Library here

The apps that were written using QtMEL:
http://srecorder.com - Screen recording software
navrocky
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« Ответ #2 : Сентябрь 15, 2010, 00:37 »

ВсЁ неправильно, всЁ не так..

Или наследуемся от QWidget и переопределяем QPaintEvent или навешиваемся на этот эвент с помощью installEventFilter. Далее глядя на все наши опции рисуем что там должно быть. По таймеру меняем опции и зовем у этого виджета update().
Записан

Гугль в помощь
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Сентябрь 15, 2010, 13:00 »

Я бы делал так:

1) У видждета завел 2 члена QPixmap. В первом сразу же нарисовал подложку которая не изменяется. Второй QPixmap вначале копия первого

2) Переопределил paintEvent для этого виджета - просто рисование (вывод) 2-й QPixmap

3) Зарядил таймер с нужным интервалом. По таймеру рисуем 2-й QPixmap как он должен быть. Часто нет смысла заморачиваться с "дорисовкой", проще скопировать 1-й во 2-й и "нарисовать с нуля". В конце ф-ции таймера вызываем repaint. Готово
  
Записан
Den2009
Гость
« Ответ #4 : Сентябрь 15, 2010, 16:43 »

не могу разобраться с QPixmap. В документации к КуТэ ничего про него нет, в инете нашел пару примеров, написал по ним простенькую программку:
Код:
QPixmap pix(550,550);
QPainter paint;
paint.begin(&pix);
QPolygonF polygon;
polygon << QPointF(ox, oy) << QPointF(ox1, oy) << QPointF(ox1, oy1) << QPointF(ox, oy1);
paint.drawPolygon(polygon);
paint.end();
но она не работает. При нажатии на кнопку Нарисовать ничего не происходит.
Подскажите, где почитать доки (на русском, с английским не очень у меня) или киньте простенький рабочий пример
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #5 : Сентябрь 15, 2010, 18:29 »

http://doc.qt.nokia.com/4.6/qpixmap.html
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Сентябрь 15, 2010, 19:28 »

Я согласен что "давать сисю" не следует, но так уж слишком жестко  Улыбающийся

Денис, все Вы правильно сделали, просто QPixmap предназначен для того чтобы "рисовать в нем" (а не на экране) и потом (в нужный момент) показать нарисованное изображение с помощью drawPixmap, сохраненный "pix" подается как параметр. "Offscreen drawing" по-нашему
Записан
Den2009
Гость
« Ответ #7 : Сентябрь 15, 2010, 21:08 »

т.е. pix надо передать виджету, на котором должно быть изображение?

появилась такая проблемка: перестал работать кусок кода после коммента рисуем квадрат... не могу понять в чем дело

Код:
#include "qpaintwidget.h"
#include "global.h"
#include <QPainter>
#include <QtCore>

QPaintWidget::QPaintWidget(QWidget *parent) : QWidget(parent)
{
}
void QPaintWidget::paintEvent(QPaintEvent *)
{
    QPainter p(this); // Создаём новый объект рисовальщика
    p.setWindow(QRect(-275,-290,550,550));
    p.setPen(QPen(Qt::red,1,Qt::SolidLine));

    //Рисуем координатную сетку
    QPolygonF polygon1;
    QPolygonF polygon2;
    polygon1 << QPointF(0,250) << QPointF(0,-250);
    polygon2 << QPointF(-250,0) << QPointF(250,0);
    p.drawPolygon(polygon1);
    p.drawPolygon(polygon2);

    //Штрихи на сетке
    for (int i = -250; i <= 250; i = i + 10)
    {
        QPolygonF polygon3;
        QPolygonF polygon4;
        polygon3 << QPointF(i, 0) << QPointF(i, 5);
        polygon4 << QPointF(0, i) << QPointF(5, i);
        p.drawPolygon(polygon3);
        p.drawPolygon(polygon4);
    }

    //рисуем квадрат   
    p.setPen(QPen(Qt::black, 1, Qt::SolidLine));
    QPolygonF polygon;
    polygon << QPointF(ox, oy) << QPointF(ox1, oy) << QPointF(ox1, oy1) << QPointF(ox, oy1);
    QTransform transform = p.transform();
    transform.rotate(180, Qt::XAxis);
    p.drawPolygon(polygon);
    p.setTransform(transform);

    //Выводим надпись
    QMatrix matrix;
    matrix.rotate(360);
    QString str;
    str = tr("Строим квадрат со стороной 20, координаты левой нижней вершины заданы пользователем");
    p.setMatrix(matrix);
    p.setFont(QFont("Times", 9, QFont::Bold));
    p.setPen(QPen(Qt::darkGreen));
    p.drawText(-250, -260, str);
}
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.049 секунд. Запросов: 23.