qt 重写paintEvent 时遇到问题
-
22-07-2019 - |
题
我在自定义小部件中对 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个像素长从微件的中间左边开始。
其他提示
只是对您所写内容的一些评论:
- 你构建画家的方式
QPainter(this)
意味着你不需要显式调用begin()
和end()
, ,QT 会为您解决这个问题。 - 考虑到这一点,析构函数永远不会被调用,这将由于所有新的内存而泄漏大量内存
QPainter
s。 - 我相当确定
this->x()
和this->y()
返回窗口的左上角,但您仍然应该在窗口顶部看到一条 5 像素宽的红线。
当您设置 QPainter
s 画笔,尝试使用 QBrush
显式构造函数,如painter->setBrush( QBrush(Qt::red) );
不隶属于 StackOverflow