5

我在一个简单的QWidget程序中遇到了 Qt/C++ 问题,该程序在 child 内绘制了一个椭圆QWidget

该程序由以下部分组成:
(1) 一个父级QWidget
(2) 一个子级QWidget(用作椭圆的绘图表面)
(3) 一个绘图QPushButton

这是代码的一部分(为简单起见,省略了 QPushButton Slot 和 Signal 代码)

void Draw::paintEvent(QPaintEvent *event) {
    QPainter painter;
    painter.begin(child_Widget);    //The line with the problem
    painter.setRenderHint(QPainter::Antialiasing, true);
    painter.setPen(QPen(Qt::black, 12, Qt::DashDotLine, Qt::RoundCap));
    painter.setBrush(QBrush(Qt::green, Qt::SolidPattern));
    painter.drawEllipse(50, 50, 100, 100);
    painter.end();}

第 2 行painter.begin(child_Widget);不执行任何操作。仅当我将第 2 行替换为painter.begin(this);但根据需要绘制在父级QWidget而不是子级时,程序才会绘制椭圆QWidget

PS 我将 child_Widget 安置在 GroupBox 内,而 GroupBox 又安置在QVBoxLayout.

有什么建议吗?

谢谢。

4

3 回答 3

8

我要尝试的第一件事是在子小部件上安装一个事件过滤器(参见QObject::installeEventFilter()),然后,在父小部件中,抓住 QEvent::Paint 事件,并在那里进行绘画。

创建子小部件的位置:

// ...
    childWidget = new QWidget(this);
    childWidget->installEventFilter(this);
// ...

然后在父母中:

bool Draw::eventFilter(QObject* 观看,QEvent* 事件)
{
    if (watched == childWidget && event->type() == QEvent::Paint) {
        QPainter 画家;
        画家.开始(childWidget);
        Painter.setRenderHint(QPainter::Antialiasing, true);
        Painter.setPen(QPen(Qt::black, 12, Qt::DashDotLine, Qt::RoundCap));
        Painter.setBrush(QBrush(Qt::green, Qt::SolidPattern));
        画家.drawEllipse(50, 50, 100, 100);
        画家.end();
        返回真;// 如果您不想让子小部件之后自行绘制,则返回 true,否则返回 false。
    }
    返回假;
}
于 2009-10-30T15:15:01.027 回答
4

QPainter 文档中所述

警告:当paintdevice是一个小部件时,QPainter只能在paintEvent()函数内部或由paintEvent()调用的函数中使用;除非设置了 Qt::WA_PaintOutsidePaintEvent 小部件属性。在 Mac OS X 和 Windows 上,您只能在 paintEvent() 函数中绘制,而不管该属性的设置如何。

如果您想在该小部件上绘图,则需要从它自己的paintEvent() 中进行。

于 2009-10-30T01:21:22.250 回答
1

您可以在像素图上绘制并在小部件绘制事件中绘制像素图。它可以是任何函数或插槽,不一定是绘制事件,例如,您可以有多个用于绘制不同的对象。您可以从像素图上的任何位置绘制,使用绘制事件的要求仅适用于将绘制像素图的小部件。如果它是一个复杂的场景,您甚至可以在另一个线程中绘制,并且只更新主线程中像素图的结果。

于 2014-05-03T19:20:20.443 回答