Qt:在子窗口小部件上使用QPainter

Ben*_*n E 4 c++ oop user-interface qt parent-child

我有一个Qt/C++问题,一个简单的QWidget程序在孩子内部绘制一个椭圆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();}
Run Code Online (Sandbox Code Playgroud)

第2行painter.begin(child_Widget);没有做任何事情.只有当我用第2行替换第2行时,程序才会绘制椭圆,painter.begin(this);但是根据需要绘制父项QWidget而不是子项QWidget.

PS我将child_Widget放在GroupBox中,而GroupBox又放在一个QVBoxLayout.

有什么建议吗?

谢谢.

Fre*_*red 7

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

在哪里创建子窗口小部件:

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

然后在父母:

bool Draw::eventFilter(QObject* watched, QEvent* event)
{
    if (watched == childWidget && event->type() == QEvent::Paint) {
        QPainter painter;
        painter.begin(childWidget);
        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();
        return true; // return true if you do not want to have the child widget paint on its own afterwards, otherwise, return false.
    }
    return false;
}


lin*_*man 4

正如QPainter 文档中所述

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

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

  • 通过子类化它并重新实现它的paintEvent() 函数。 (2认同)