qt覆盖paintEvent的麻烦

Geo*_*Geo 1 c++ qt widget qprogressbar

我在自定义小部件中继承了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();

}
Run Code Online (Sandbox Code Playgroud)

我试图显示一条红线作为起点,看看我可以将自己的修改添加到小部件.但是,这不起作用.我只将小部件视为常规QProgressBar.关于什么可能出错的任何想法?

Dou*_*oug 6

您需要使用的坐标系相对于窗口小部件的左上角,但您显然使用了一个相对于窗口小部件父级的相对坐标系.(小部件的x和y坐标是相对于它们的父级).所以你的线将被削减.

此外,当您使用QWidget*参数构造它时,不必调用QPainter :: begin和QPainter :: end.并且代码中的画家也不会被删除.没有必要在堆上创建一个画家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像素长的红色水平线.