Проблемы с переопределением paintEvent - PullRequest
1 голос
/ 08 мая 2009

Я создаю подкласс QProgressBar в пользовательском виджете и перезаписал метод paintEvent следующим кодом:


void myProg::paintEvent(QPaintEvent *pe)
{
    QProgressBar::paintEvent(pe);
    QRect region = pe->rect();
    QPainter *painter = new QPainter(this);
    QPen *pen = new QPen;
    painter->begin(this);
    painter->setBrush(Qt::red);
    int x = this->x();
    int y = this->y();
    pen->setWidth(10);
    painter->setPen(*pen);
    painter->drawLine(x,y,x+100,y);
    painter->end();

}

Я пытаюсь отобразить красную линию в качестве отправной точки, чтобы увидеть, что я могу добавить свои собственные модификации в виджет. Тем не менее, это не работает. Я вижу виджет только как обычный QProgressBar. Есть идеи, что может быть не так?

Ответы [ 2 ]

6 голосов
/ 08 мая 2009

Система координат, которую вам нужно использовать, относительно верхней левой части виджета, но вы, очевидно, используете одну из них относительно родителя виджета. (Координаты x и y виджета относительно их родителя). Таким образом, ваша линия будет обрезана.

Кроме того, нет необходимости вызывать QPainter :: begin и QPainter :: end, когда вы создаете его с помощью параметра QWidget *. И художник в вашем коде тоже не удаляется. Нет необходимости создавать рисовальщик в куче с помощью new: я бы просто создал его в стеке.

Попробуйте:


void myProg::paintEvent(QPaintEvent *pe)
{
    QProgressBar::paintEvent(pe);
    QRect region = pe->rect();
    QPainter painter(this);
    QPen pen(Qt::red); //Note: set line colour like this

    //(Brush line removed; not necessary when drawing a line)
    int x = 0; //Note changed
    int y = height() / 2; //Note changed
    pen.setWidth(10);
    painter.setPen(pen);
    painter.drawLine(x,y,x+100,y);

}

Это должно нарисовать красную горизонтальную линию длиной 100 пикселей, начиная с середины слева от виджета.

1 голос
/ 08 мая 2009

Несколько комментариев о том, что вы написали:

  1. То, как вы построили художника QPainter(this), означает, что вам не нужно явно звонить begin() и end(), QT позаботится об этом за вас.
  2. Имея это в виду, деструктор никогда не вызывается, это приведет к утечке памяти из-за всех новых QPainter s.
  3. Я почти уверен, что this->x() и this->y() возвращают верхний левый угол окна, но вы все равно должны увидеть красную линию шириной 5 пикселей в верхней части окна.

Когда вы устанавливаете кисть QPainter s, попробуйте явно использовать конструктор QBrush, как в painter->setBrush( QBrush(Qt::red) );

...