qt覆盖paintEvent的麻烦

时间:2009-05-08 13:05:26

标签: 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();

}

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

2 个答案:

答案 0 :(得分: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像素长的红色水平线。

答案 1 :(得分:1)

关于你写的内容的几点评论:

  1. 您构建画家QPainter(this)的方式意味着您无需明确调用begin()end(),QT会为您处理。
  2. 考虑到这一点,析构函数永远不会被调用,由于所有新的QPainter s,这将泄漏一堆内存。
  3. 我非常确定this->x()this->y()会返回窗口的左上角,但您仍然应该在窗口顶部看到一条5像素宽的红线。
  4. 设置QPainter画笔时,请尝试明确使用QBrush构造函数,如下所示 painter->setBrush( QBrush(Qt::red) );