我遇到了一个简单的 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/