Qt4 Как нарисовать внутри виджета? - PullRequest
14 голосов
/ 09 октября 2010

Qt4, QtCreator

Я пытаюсь нарисовать внутри виджета:

void Widget::on_pushButton_clicked()
{
    QPainter painter;

    painter.begin(ui->label);

    QRectF rectangle(10.0, 20.0, 80.0, 60.0);
     int startAngle = 30 * 16;
     int spanAngle = 120 * 16;
     painter.drawArc(rectangle, startAngle, spanAngle);

    painter.end();
}

Но когда я нажимаю кнопку, ничего не происходит.

Как это сделать правильно?

Ответы [ 2 ]

23 голосов
/ 09 октября 2010

Вам нужно переопределить paintEvent () и сделать там рисование. Вам не нужны begin() и end(). Объявить художника с

QPainter painter(this);

Конструктор будет обрабатывать begin(), и end() будет вызываться, когда объект painter выходит из области видимости и уничтожается.

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

void Widget::on_pushButton_clicked()
{
    drawShapes = !drawShapes;
    update();
}

void Widget::paintEvent(QPaintEvent *)
{
    QPainter painter(this);

    if(drawShapes)
    {
        QRectF rectangle(10.0, 20.0, 80.0, 60.0);
        int startAngle = 30 * 16;
        int spanAngle = 120 * 16;
        painter.drawArc(rectangle, startAngle, spanAngle);
    }
}

UPDATE:

Чтобы избежать необходимости переопределять paintEvent() виджета, вы можете использовать QLabel, назначить ему растровое изображение и нарисовать его. Примечание. Насколько я могу судить, вам необходимо устанавливать растровое изображение каждый раз, когда вы его изменяете.

void MainForm::slot_buttonClick()
{
    QPixmap pixmap(100,100);
    pixmap.fill(QColor("transparent"));

    QPainter painter(&pixmap);
    painter.setBrush(QBrush(Qt::black));
    painter.drawRect(10, 10, 100, 100);

    label.setPixmap(pixmap);
}
1 голос
/ 09 октября 2010

Если вы перезаписываете метод рисования, как описано Арнольдом Спенсом, вам следует вызвать родитель paintEvent, или вы получите виджет, который отображает ваш прямоугольник только на белом фоне.

...