gpt4 book ai didi

c++ - qt 无法覆盖 paintEvent

转载 作者:行者123 更新时间:2023-11-30 00:42:26 24 4
gpt4 key购买 nike

我在自定义小部件中子类化了 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。关于可能出错的任何想法?

最佳答案

您需要使用的坐标系是相对于小部件左上角的坐标系,但显然您使用的是相对于小部件父级的坐标系。 (Widget 的 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 像素长的红色水平线。

关于c++ - qt 无法覆盖 paintEvent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/839705/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com