1

我在自定义小部件中继承 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。关于什么可能是错的任何想法?

4

2 回答 2

6

您需要使用的坐标系是相对于小部件的左上角的,但您显然使用的是相对于小部件的父级的坐标系。(小部件的 x 和 y 坐标相对于它们的父级)。所以你的线会被剪掉。

此外,当您使用 QWidget * 参数构造它时,无需调用 QPainter::begin 和 QPainter::end。而且您代码中的画家也不会被删除。没有必要在堆上创建一个画家new:我只是在堆栈上创建它。

尝试:

无效 myProg::paintEvent(QPaintEvent *pe)
{
    QProgressBar::paintEvent(pe);
    QRect 区域 = pe->rect();
    QPainter 画家(本);
    QPen 笔(Qt::red);//注意:像这样设置线条颜色

    //(画笔线被移除;画线时不需要)
    诠释 x = 0; //注意改变了
    int y = 高度() / 2; //注意改变了
    pen.setWidth(10);
    画家.setPen(笔);
    画家.drawLine(x,y,x+100,y);

}

这应该从小部件的左中部开始绘制一条 100 像素长的红色水平线。

于 2009-05-08T13:22:45.030 回答
1

只是对你写的东西的一些评论:

  1. 您构建画家的QPainter(this)方式意味着您不需要显式调用begin()and end(),QT 会为您处理。
  2. QPainter考虑到这一点,析构函数永远不会被调用,这将由于所有 new s而泄漏大量内存。
  3. 我很确定this->x()this->y()返回窗口的左上角,但您仍然应该在窗口顶部看到一条 5 像素宽的红线。

设置QPainters 画笔时,尝试显式使用QBrush构造函数,如 painter->setBrush( QBrush(Qt::red) );

于 2009-05-08T13:22:10.927 回答