crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

6 страниц V   1 2 3 > »   
Ответить в данную темуНачать новую тему
zuze
  опции профиля:
сообщение 29.12.2012, 12:04
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 211
Регистрация: 4.11.2012
Пользователь №: 3589

Спасибо сказали: 0 раз(а)




Репутация:   0  


У меня проблема со стиранием нарисованной картинки в определённой области.
Я рисую прямо на окне:
1. Рисую фон прямоугольный
2. Рисую решётку (с помощью горизонтальных и вертикальной линии)
3. Также рисую картинку по данным из двухмерного массива
4. Также рисую линию

Мне надо только картинку удалить которую я нарисовал (пункт 3)

Я попробовал использовать

p->eraseRect();


Указав в скобках область в которой будет закрашивать, но закрасилось почти всё и фон и решётка и рисунок.

Как мне правильно удалить нарисованный рисунок, но чтобы остальное не удалилось?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
mezmay
  опции профиля:
сообщение 29.12.2012, 14:40
Сообщение #2


Активный участник
***

Группа: Участник
Сообщений: 272
Регистрация: 13.7.2009
Из: Ростов-на-Дону
Пользователь №: 904

Спасибо сказали: 16 раз(а)




Репутация:   1  


void QPainter::save ()

void QPainter::restore ()

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 29.12.2012, 16:01
Сообщение #3


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(zuze @ 29.12.2012, 14:04) *
Мне надо только картинку удалить которую я нарисовал (пункт 3)
Если речь идёт об удалении "потом" (при следующем вызове события рисования), то могу предложить такой вариант:
1) Всю статику (то что не изменяет или изменяется редко) рисовать вне paintEvent на QImage (или QPixmap).
2) Рисовать "картинку по данным из двухмерного массива" тоже вне paintEvent на QImage (или QPixmap).
3) В paintEvent рисовать ранее созданный QImage со статикой
4) В этом же paintEvent рисовать ранее созданный QImage с "картинкой по данным из двухмерного массива"
5) при обновлении данных перерисовывать QImage с "картинкой по данным из двухмерного массива" (как в п.2)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 29.12.2012, 16:06
Сообщение #4


фрилансер
******

Группа: Участник
Сообщений: 2943
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


zuze, я ничего не понял, про какую картинку речь ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
zuze
  опции профиля:
сообщение 29.12.2012, 20:38
Сообщение #5


Участник
**

Группа: Участник
Сообщений: 211
Регистрация: 4.11.2012
Пользователь №: 3589

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Алексей1153 @ 29.12.2012, 16:06) *
я ничего не понял, про какую картинку речь ?


Картинки рисуются ввиде заполнения числами модели RGB. Может можно тогда убрать фон прямоугольник и в место него выводить картинки, тогда можно наверно удалять картинку перед появлением новой картинки.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 30.12.2012, 7:35
Сообщение #6


фрилансер
******

Группа: Участник
Сообщений: 2943
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


zuze, не проще таблицу применить ? )
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
zuze
  опции профиля:
сообщение 3.1.2013, 17:44
Сообщение #7


Участник
**

Группа: Участник
Сообщений: 211
Регистрация: 4.11.2012
Пользователь №: 3589

Спасибо сказали: 0 раз(а)




Репутация:   0  


Я решил "3. Также рисую картинку по данным из двухмерного массива" рисовать в место "1. Рисую фон прямоугольный", так как хоть картинка и светлая, но портила вид "2. Рисую решётку (с помощью горизонтальных и вертикальной линии)". Тогда и метод eraseRect() можно воспользоваться.

Вот только пока не понимаю почему, но зрительно видна только последняя (третья) картинка, хотя я задаю вывод трёх картинок с интервалом 10 мс. Может это очень быстро и глаз не успевает заметить?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
zuze
  опции профиля:
сообщение 6.1.2013, 20:48
Сообщение #8


Участник
**

Группа: Участник
Сообщений: 211
Регистрация: 4.11.2012
Пользователь №: 3589

Спасибо сказали: 0 раз(а)




Репутация:   0  


Сделал таймер на 3 минуты, но к сожалению отображается всё равно последний файл.

Как я это делаю:

1. В Конструкторе

QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(MyClick()));
timer->start(3000);


2. Алгоритм MyClick()

2.1 Открытие файла
2.2 Очистка области
2.3 Два цикла для считывания значения из файла и занесения в двухмерный массив, а также рисования каждого значения двухмерного массива с помощью drawPoint
2.4 Зацикливание, то есть переход к следующему

3. В переопределение paintEvent я вызываю MyClick().

Я с помощью qDebug() проверил совпадает ли имена файлов и их порядковое значение, то есть
i = 1; fp = 1.dat
i = 2; fp = 2.dat
i = 3; fp = 3.dat

Также проверял каждый файл в отдельности, картинка разная рисуется.

Значит дело не в том, что я файлы не правильно считываю. В чём же ещё может быть проблема, что выводится, только картинка из последнего файла?

void p::MyClick()
{
    struct _finddata_t f;
    long int hFile;
    chdir("file");
    hFile = _findfirst("*.dat", &f);
    int KolAllFile = hFile;
 
    while (KolAllFile != -1)
    {
            QPainter *Tochka = new QPainter(this);
            int rc;
            long int size;
            FILE *fp = fopen(f.name, "rb");
 
            if (fp == NULL)
               qDebug() << "Cannot open file read!";
 
            Tochka->eraseRect(50, 50, 720, 492);
            for (int j = 0; j < 720; j++)
            {
                for (int i = 0; i < 492; i++)
                {
                    rc = getc(fp);
                    buffer[i][j] = rc;
                    Tochka->setPen(QColor(buffer[i][j], buffer[i][j], buffer[i][j], 127)); // Задание цвета
                    Tochka->drawPoint(50+j, 542-i);    // Рисуем точку
                }
            }
            delete Tochka;
            fclose(fp);
        }
        KolAllFile = _findnext(hFile, &f);
    }
}


Так как я делаю

delete Tochka;


то отображается последняя картинка, но убирание этой строчки кода ситуацию не меняет, вроде это происходит потому, что я рисую всё подряд за один раз.
Мог бы кто-нибудь рассказать, что значит сделать не за раз?

Сообщение отредактировал zuze - 6.1.2013, 21:34
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 7.1.2013, 18:00
Сообщение #9


фрилансер
******

Группа: Участник
Сообщений: 2943
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


zuze, тебе несколько человек сказали: рисуй в обработчике paintEvent

а ты рисуешь в обработчике таймера

время - это сдвиг фазы. В обработчике рисования выводишь картинку для текущей фазы. После этого скорость показа будет зависеть только от тактования
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
zuze
  опции профиля:
сообщение 8.1.2013, 16:26
Сообщение #10


Участник
**

Группа: Участник
Сообщений: 211
Регистрация: 4.11.2012
Пользователь №: 3589

Спасибо сказали: 0 раз(а)




Репутация:   0  


Алексей1153, я понял надо было сделать так:

1. В Конструкторе

QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(MyTimer()));
timer->start(3000);


2. Описание MyTimer()

void l::MyTimer()
{
    this->update();
}


3. Функция MyClick() осталась прежней.

4. В методе paintEvent() вписываю MyClick();

Всё равно появляется только последний файл. Почему?

Сообщение отредактировал zuze - 8.1.2013, 16:27
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

6 страниц V   1 2 3 > » 
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 9.5.2025, 12:48