c++ - Qt:在子部件上使用 QPainter

标签 c++ user-interface oop qt parent-child

我遇到了一个简单的 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); 不执行任何操作。仅当我将第 2 行替换为 painter.begin(this); 时,该程序才会绘制椭圆,但它绘制在父级 QWidget 而不是子级 QWidget 根据需要。

附言我将 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;
}

关于c++ - Qt:在子部件上使用 QPainter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1647424/

相关文章:

c++ - 在 CPU 上并行减少数组

c++ - 如何在 QML 中访问 C++ 类对象而不是在 QML 中创建单独的对象?

c++ - 在 C++ 中删除和推回 vector 的元素

python - 类型错误 : __init__() takes at least 3 arguments (1 given)

java - Apache 枢轴 : BoxPane with one filling element

linux - 在 x86-64(linux) 上进行 GUI 编程的相关系统调用是什么?

C# - 将 HTML 编写为字符串的面向对象方式?

c++ - EOF 突然到达 ifstream 中的 getline()

c++ - C++中的动态调度和后期绑定(bind)有什么区别?

c++ - union 和类(Class)