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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: При перерисовке виджета старый рисунок остаётся  (Прочитано 3103 раз)
Gvardman
Гость
« : Июнь 15, 2014, 02:56 »

Добрый день, помогите пожалуйста.
Есть два класса, Line и Triangle
В Line в функцию draw() передаётся указатель на QPainter и происходит отрисовка
Код:
Line::Line(QWidget *parent, Point *pt1, Point *pt2) : QWidget(parent), point1(pt1), point2(pt2)
{
    setMinimumSize(parent->size());
}
void Line::draw(QPainter *painter)
{
    painter->setPen(QPen(Qt::red, 1, Qt::SolidLine));
    qreal x1 = point1->getX(), y1 = point1->getY(),
            x2 = point2->getX(), y2 = point2->getY();
    qreal k, b, y;
    k = (y2 - y1) / ( x2 - x1 );
    b = y1 - k * x1;
    if(x1 > x2) {
        int t = x1; x1 = x2; x2 = t;
    }
    if (x1 != x2)
    {
        for(double x = x1; x < x2; x += 0.1)
        {
            y = k * x + b;
            painter->drawPoint(QPointF(x, y));
        }
    }
    else
    {
        if (y1 > y2) {
            int ty = y1; y1 = y2; y2 = ty;
        }
        for(qreal y = y1; y < y2; y++)
            painter->drawPoint(QPointF(x1, y));
    }
}
В классе Triangle переопределен paintEvent. Там создаются три объекта Line (объявлены в private) и происходит их отрисовка
Код:
void Triangle::paintEvent(QPaintEvent *)
{
    ln1 = new Line(this, A, B);
    ln2 = new Line(this, A, C);
    ln3 = new Line(this, B, C);
    QPainter painter(this);
    ln1->draw(&painter);
    ln2->draw(&painter);
    ln3->draw(&painter);
}
В MainWindow создаётся объект Triangle (объявление в private), в качестве родителя передаётся прямоугольный виджет, созданный в дизайнере.
Код:
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    trgl = new Triangle(ui->graphicArea, 50, 50, 50);
    ui->graphicArea->setAttribute(Qt::WA_OpaquePaintEvent);
    ui->graphicArea->show();
Проблема вот в чем: есть кнопка, при нажатии на которую треугольник должен перерисоватся с заданными координатами, но вместо перерисовки рисуется новый треугольник, старый остаётся на месте (пробовал не использовать new, а менять координаты через сэттер, не помогло).
Код:
void MainWindow::setTriangleButton()
{
    qreal x, y, len;
    x = ui->TriangleXCoord->value();
    y = ui->TriangleYCoord->value();
    len = ui->TriangleLength->value();
    trgl = new Triangle(ui->graphicArea, x, y, len);
    trgl->show();
}
Почему так?
Заливать фон полностью перед пересозданием объекта не выйдет, у меня там не только треугольник.
Буду очень благодарен за помощь!
Записан
Achernar
Гость
« Ответ #1 : Июнь 15, 2014, 03:28 »

А удалить сначала не пробовали?

И насколько помню нужно позвать update();

Код:
ui->graphicArea->update();
« Последнее редактирование: Июнь 15, 2014, 03:31 от Achernar » Записан
Gvardman
Гость
« Ответ #2 : Июнь 15, 2014, 04:20 »

А удалить сначала не пробовали?

И насколько помню нужно позвать update();
Удалить пробовал. Делал при нажатии на кнопку delete trgl;
Не помогало.
update - аналогично
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #3 : Июнь 15, 2014, 06:52 »

Не устанавливайте атрибут WA_OpaquePaintEvent или сами рисуйте фон виджета.
« Последнее редактирование: Июнь 15, 2014, 06:56 от Old » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Июнь 15, 2014, 11:06 »

Код:
    trgl = new Triangle(ui->graphicArea, 50, 50, 50);
Так ведь предыдущий trgl никто не удалял. То же самое с ln1 (2, 3). На каждом рисовании создаются новые и новые объекты
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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