繁体   English   中英

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

[英]Qt: Using QPainter on child widgets

我有一个简单的QWidget程序的Qt / C ++问题,该程序在子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); 什么都不做 只有当我用painter.begin(this);替换第2行时,程序才会绘制椭圆painter.begin(this); 但这取决于父QWidget而不是根据需要在子QWidget

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

有什么建议吗?

谢谢。

我要尝试的第一件事是在子窗口小部件上安装一个事件过滤器(参见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;
}

QPainter文档中所述

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

如果你想在那个小部件上绘图,你需要从它自己的paintEvent()中完成。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM