проблема с qt, переопределяющая paintEvent
-
22-07-2019 - |
Вопрос
Я создаю подкласс QProgressBar в пользовательском виджете, и я переписал Событие рисования метод со следующим кодом :
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.Есть какие - нибудь идеи о том , что может быть не так ?
Решение
Система координат, которую вам нужно использовать, находится относительно верхнего левого края виджета, но вы, очевидно, используете систему координат относительно родительского виджета.(Координаты x и y виджета указаны относительно их родительского элемента).Таким образом, ваша строка будет обрезана.
Кроме того, нет необходимости вызывать QPainter::begin и QPainter ::end, когда вы создаете его с помощью параметра QWidget *.И художник в вашем коде тоже не удаляется.Нет необходимости создавать painter в куче с помощью 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 пикселей, начинающаяся от среднего левого края виджета.
Другие советы
Всего несколько комментариев о том, что вы написали:
<Ол> QPainter (this)
, означает, что вам не нужно явно вызывать begin ()
и end ()
QT позаботится об этом за вас. QPainter
. this- > x ()
и this- > y ()
вернут верхний левый угол окна, но вы все равно должны это сделать увидеть красную линию шириной 5 пикселей в верхней части окна. Когда вы устанавливаете кисть QPainter
, попробуйте явно использовать конструктор QBrush
, как в
painter- > setBrush (QBrush (Qt :: red));