Вопрос

Я создаю подкласс 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));

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top