【问题标题】:qt trouble overriding paintEventqt麻烦覆盖paintEvent
【发布时间】:2009-05-08 13:05:26
【问题描述】:

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

【问题讨论】:

    标签: c++ qt widget qprogressbar


    【解决方案1】:

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

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

    试试:

    无效 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 像素长的红色水平线。

    【讨论】:

    • 是否可以设置某种调试标志来说明屏幕上是否显示某些内容?
    • Geo:我认为没有调试标志。如果您担心这可能会成为未来的问题,您可以做几件事。您可以尝试例如在您的小部件上绘制一个大红色框,从 -10000、-10000 到 10000、10000,希望您能看到一些东西,然后更改您的代码,直到您再也看不到输出为止。您也可以尝试从 QPainter 获取剪切区域或剪切路径并打印出它们的边界矩形,检查坐标是否接近您的想法。
    【解决方案2】:

    就你写的东西简单说几句:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-28
      • 2021-09-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多