2009-05-08 4 views
1

Я подклассы QProgressBar в пользовательском виджете, и я переписал в метод paintEvent со следующим кодом:кварты беды перекрывая 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. Любые идеи о том, что может быть неправильным?

ответ

7

системе вам необходимо использовать координаты относительно верхнего левого виджета, но вы очевидно, используя один из них относительно родителя виджетов. (Координаты виджета 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 пикселей, начиная с середины левой части виджета.

+0

Можно ли установить флаг отладки, который скажет, если что-то отображается на экране или нет? – Geo

+0

Geo: Я не думаю, что есть флаг отладки. Есть несколько вещей, которые вы можете сделать, если беспокоитесь, что это может быть проблемой в будущем. Вы можете попробовать, например. нарисуйте большой красный ящик над вашим виджетами от -10000, -10000 до 10000, 10000, надеясь, что вы что-то увидите, а затем измените свой код, пока вы больше не сможете видеть выход. Вы также можете попробовать получить область отсечения или обтравочный путь из QPainter и распечатать их ограничивающие прямоугольники, проверяя, находятся ли координаты близко к тому, что вы думаете. – Doug

1

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

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

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