crossplatform.ru

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

6 страниц V  < 1 2 3 4 > »   
Ответить в данную темуНачать новую тему
> Как очистить то, что нарисовал с помощью QPainter
Алексей1153
  опции профиля:
сообщение 9.1.2013, 8:50
Сообщение #11


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

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

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




Репутация:   34  


так ты фазу не смотришь, бацаешь всё в цикле while (KolAllFile != -1)

кстати, необязательно делать паинтер на куче
QPainter *Tochka = new QPainter(this);

можешь на стеке
QPainter Tochka(this);

так как в каждой итерации цикла это будет новая переменная. И цикла, вообще говоря, не будет, когда станешь фазу учитывать - рисование произойдёт один раз
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
zuze
  опции профиля:
сообщение 11.1.2013, 9:20
Сообщение #12


Участник
**

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

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




Репутация:   0  


Я пытался сделать так

int rc;                    // В public у класса  
long int size;          // В public у класса
char namefile[12]; // В public у класса

// Может это и не красиво, но я объявил эти переменные глобально
int buffer[492][720];
char NameFiles[670][12];
int frame = 0;

void l::MyDraw()
{
    timerRLP = new QTimer(this);
    connect(timerRLP, SIGNAL(timeout()), this, SLOT(MyTimeTick()));
    timerRLP->start(3000);

    QPainter Tochka;
    Tochka.begin(this);
    Tochka.eraseRect(QRect(50, 50, 720, 492));
    for (int j = 0; j < 720; j++)
    {
        for (int i = 0; i < 492; i++)
        {
            Tochka.setPen(QColor(buffer[i][j], buffer[i][j], buffer[i][j], 127)); // Задание цвета
            Tochka.drawPoint(50+j, 542-i);    // Рисуем точку
        }
    }
    Tochka.end();
}
// Массив имён файлов
void l::MyNameFile()
{
    struct _finddata_t f;
    long int hFile;
    int i = 0;
    chdir("file");
    hFile = _findfirst("*.dat", &f);
    int KolAllFile = hFile;

    while (KolAllFile != -1)
    {
        FILE *fp = fopen(f.name, "rb");
        if (fp == NULL)
           qDebug() << "Cannot open file read!";

        strcpy(NameFiles[i], f.name);
        i++;
        fclose(fp);
        KolAllFile = _findnext(hFile, &f);
    }
    _findclose(hFile);
}

void l::MyTimeTick()
{
    // Эти три строчки были сделаны потому, что   NameFiles[0] лежит имя первого файла + все последующие, хотя до этого лежало, только имя первого файла
    //  NameFiles[1]  лежит имя второго файла + все последующие, хотя до этого лежало, только имя второго файла
    strcpy(namefile, "");
    strncpy(namefile, NameFiles[frame], 11);
    strcat(namefile, "C");

    FILE *fp = fopen(namefile, "rb");

    if (fp == NULL)
       qDebug() << "Cannot open file read!";

    for (int j = 0; j < 720; j++)
    {
        for (int i = 0; i < 492; i++)
        {
            rc = getc(fp);
            buffer[i][j] = rc;
        }
    }
    fclose(fp);
    if (frame < 670)
    {
        this->update();
        frame++;
    }
    else
    {
       frame = 0;
       this->update();
    }
}


В конструкторе

connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(MyNameFile()));


В paintEvent() я добавил

if (ui->checkBox_4->isChecked())
   MyDraw();


В результате рисуется вся область самым нижним цветом (у меня он серый) и через какое-то время зависает.
Выскакивает окно с тремя кнопками вторая кнопка "Закрыть", третья "Отладить".
Я нажимаю закрыть и появляется ошибка: Завершение с кодом -1073741819.

А должны выводится которые меняются в данном случае через три секунды. Что же я делаю не так?

Сообщение отредактировал zuze - 11.1.2013, 10:01
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
zuze
  опции профиля:
сообщение 11.1.2013, 10:57
Сообщение #13


Участник
**

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

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




Репутация:   0  


Избавился от ошибки переместив

timerRLP = new QTimer(this);
connect(timerRLP, SIGNAL(timeout()), this, SLOT(MyTimeTick()));


В конструктор. Но результат рисуется такой же, вся область самым нижним цветом (у меня он серый).

Сообщение отредактировал zuze - 11.1.2013, 10:57
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 14.1.2013, 12:20
Сообщение #14


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

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

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




Репутация:   34  


у тебя в голове каша ))

давай попробуем иначе:

1) создай новый проект и напиши программу, где есть один диалог. Когда по окну диалога щёлкают, пусть он закрасится одним цветом, когда ещё раз - другим. Пусть всего 3 цвета. Закрашивай в paintEvent (непосредственно там, без всяких перевызовов!)

2) дополнительно - почитай про std::vector, и замени свои глобальные массивы хотя бы им

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
zuze
  опции профиля:
сообщение 14.1.2013, 19:11
Сообщение #15


Участник
**

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

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




Репутация:   0  


Вопрос решён. Дело было в том, что я не учёл '\0' в именах файлов.
Писал так:

char NameFiles[670][12];


а надо было так:

char NameFiles[670][13];
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 14.1.2013, 22:03
Сообщение #16


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

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

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




Репутация:   34  


zuze, но ты же понимаешь, что так дела не делаются. Храни в одном из текстовых форматов лучше - столько проблем автоматом отпадут, ты бы только знал )

Я это всё давно прошёл
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
zuze
  опции профиля:
сообщение 15.1.2013, 5:40
Сообщение #17


Участник
**

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

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




Репутация:   0  


Алексей1153, большое спасибо за помощь. К сожалению от вида файлов которые мне даны отказаться нельзя, так как даны мне для использования и ни кто переделывать их не будет.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 15.1.2013, 6:02
Сообщение #18


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

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

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




Репутация:   34  


zuze, сделай конвертер и перегоняй в нужный вид. С ним и работай
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
zuze
  опции профиля:
сообщение 16.1.2013, 9:31
Сообщение #19


Участник
**

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

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




Репутация:   0  


Почему я не могу стереть то, что рисовалось с помощью Qpainer?

if (ui->radioButton->isChecked())
{
   Qpainer p(this);
   if (!ui->CheckBox->isChecked())
   {
      p.setBrush(QBrush(Qt::black));
      p.drawRect(50, 50, 720, 492);
   }
   else
   {
      p.eraseRect(50, 50, 720, 492);
      MyDraw();
   }
}


Этот код описан в переопределении paintEvent().
Не выполняется

p.eraseRect(50, 50, 720, 492);
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 16.1.2013, 17:50
Сообщение #20


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

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

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




Репутация:   34  


1) Qpainer - что за класс ?
2) доходит ли выполнение до этого места ? (p.eraseRect(50, 50, 720, 492)
3) и что делает MyDraw ?

Сообщение отредактировал Алексей1153 - 16.1.2013, 17:52
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 31.12.2025, 10:12