我在自定义小部件中继承了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。关于什么可能出错的任何想法?
答案 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)
关于你写的内容的几点评论:
QPainter(this)
的方式意味着您无需明确调用begin()
和end()
,QT会为您处理。QPainter
s,这将泄漏一堆内存。this->x()
和this->y()
会返回窗口的左上角,但您仍然应该在窗口顶部看到一条5像素宽的红线。设置QPainter
画笔时,请尝试明确使用QBrush
构造函数,如下所示
painter->setBrush( QBrush(Qt::red) );