我在自定义小部件中对 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。对可能出什么问题有什么想法吗?

有帮助吗?

解决方案

您需要使用的坐标系是相对于左上角的小部件,但你显然是使用一个相对小部件的父。 (Widget的X和Y COORDS是相对于他们的父母)。所以,你的行会被限幅。

此外,它不需要调用了QPainter :: begin和QPainter的::结束的时候,你使用一个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个像素长从微件的中间左边开始。

其他提示

只是对您所写内容的一些评论:

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top