QPainter обновляет данные

У меня проблема с обновлением чертежа. У меня есть 2 файла: mainwindow.cpp и drawwidget.cpp. В mainwindow я загружаю файл с параметрами точки x, y. Когда я нажимаю кнопку, я выбираю несколько из них и передаю их в drawwidget, чтобы нарисовать эти точки.

Чтобы увидеть, как это будет работать, я временно нарисовал эллипс и умножил "p" на размер. Когда я нажимаю кнопку, «p» меняет значение (я напечатал его в QMessageBox и его другое значение), но эллипс остается того же размера. Что я делаю неправильно?

DrawWidget::DrawWidget(QWidget *parent) :
    QWidget(parent)
{
    p=30;
}
void DrawWidget::paintEvent(QPaintEvent *)
{
    QStyleOption opt;
    opt.init(this);
    QPainter painter(this);
    style()->drawPrimitive(QStyle::PE_Widget, &opt, &painter, this);
    painter.setRenderHint(QPainter::Antialiasing);
    paint(painter);
}
void DrawWidget::paint(QPainter &painter)
{
    painter.drawEllipse( QRect( 1*p-5, 5*p-5, 10, 10 ) );
}
void DrawWidget::handleData(sPunkt *&Tab_pkt)
{
    p=Array[0].x;
    update();
}

person kubizen    schedule 15.05.2016    source источник
comment
Итак, последние 2 параметра QRect::QRect(int, int, int, int) — это ширина и высота, которые являются константами в вашем коде (10). Так что размер не должен меняться. Вы только меняете позицию.   -  person thuga    schedule 16.05.2016
comment
Да, моя вина, но я написал это, чтобы посмотреть, не меняется ли что-нибудь и ничего не происходит, когда я меняю значение p.   -  person kubizen    schedule 16.05.2016
comment
Хорошо, тогда проверьте значение p в методе paint. Распечатать сообщение QDebug или что-то в этом роде.   -  person thuga    schedule 17.05.2016


Ответы (1)


Вам нужно update() ваш виджет, чтобы вызвать QPaintEvent и последующий вызов paintEvent().

Событие рисования — это запрос на перерисовку всего или части виджета. Это может произойти по одной из следующих причин:

  • была вызвана функция repaint() или update(),
  • виджет был скрыт, а теперь открыт, или
  • много других причин.

См. документы: QWidget::paintEvent()

person Ivan Aksamentov - Drop    schedule 16.05.2016
comment
Я обновил его здесь: void DrawWidget::handleData(sPunkt *&Tab_pkt) { p=Array[0].x; update(); }, но он не работает. - person kubizen; 16.05.2016