我在一个简单的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行时,程序才会绘制椭圆,但是根据需要使用父QWidget
而不是子QWidget
。
P.S。我将child_Widget放在GroupBox中,而GroupBox又放在QVBoxLayout
内。
有任何建议吗?
感谢。
答案 0 :(得分: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; }
答案 1 :(得分:4)
警告:当paintdevice是一个小部件时,QPainter只能在paintEvent()函数内或paintEvent()调用的函数中使用;除非设置了Qt :: WA_PaintOutsidePaintEvent小部件属性。在Mac OS X和Windows上,无论此属性的设置如何,您都只能在paintEvent()函数中绘制。
如果你想绘制那个小部件,你需要从它自己的paintEvent()中进行绘制。
答案 2 :(得分:1)
您可以在像素图上绘制并在小部件绘制事件中绘制像素图。它可以是任何功能或槽,不一定是油漆事件,例如你可以有多个用于绘制不同的对象。您可以从像素图上的任何位置进行绘制,使用绘制事件的要求仅适用于绘制像素图的小部件。如果它是一个复杂的场景,你甚至可以在另一个线程中绘制,只更新主线程中pixmap的结果。