gpt4 book ai didi

c++ - 如何在子部件而不是父部件上画一条线?

转载 作者:行者123 更新时间:2023-11-30 05:16:15 25 4
gpt4 key购买 nike

我正在尝试在 QWidget 上画一条线(和一些其他图元)。该 QWidget 在物理上“位于”另一个带有图片的小部件之上。我想在图片上画线和圆圈。

我已经知道如何画线了。我可以用这段代码做到这一点:

bool MySpecialWidget::eventFilter( QObject* watched, QEvent* event )
{
if (watched == this && event->type() == QEvent::Paint)
{
QPainter painter(this);

painter.translate(50, 50);

painter.setPen(QPen(Qt::blue, 12));
painter.setBrush(Qt::BrushStyle::SolidPattern);
painter.drawLine(0, 0, 200, 200);
}

return false;
}

但我真正想做的是放置一个小部件来放置图片,然后在其上方放置一个小部件以放置线条。像这样:

MySpecialWidget::MySpecialWidget(QWidget *parent) : QWidget(parent)
{
QRect position = QRect(30, 50, 600, 600);

pictureBox = new QLabel(parent);
pictureBox->setGeometry(position);
pictureBox->setPixmap(QPixmap(QString::fromUtf8(":/main/graphics/MyPicture.png")));
pictureBox->setScaledContents(true);

drawnElements = new QWidget(parent);
drawnElements->setGeometry(position);
drawnElements->raise();

this->installEventFilter(this);
}

然后绘制线条和基元,我想这样做:

bool MySpecialWidget::eventFilter( QObject* watched, QEvent* event )
{
if (watched == this && event->type() == QEvent::Paint)
{
QPainter painter(drawnElements);

painter.translate(50, 50);

painter.setPen(QPen(Qt::blue, 12));
painter.setBrush(Qt::BrushStyle::SolidPattern);
painter.drawLine(0, 0, 200, 200);
}

return false;
}

但这行不通。什么都没有画。空白。

问题是读取 QPainter painter(drawnElements);

的行

如果我说 QPainter painter(this);,它会绘制一些东西,但它不在子部件上,而是在父部件上。

最佳答案

关于这个主题的文档非常清楚:

Each widget performs all painting operations from within its paintEvent() function. This is called whenever the widget needs to be redrawn, either as a result of some external change or when requested by the application.

您应该只在其绘制事件中绘制一个小部件,并且您应该只在那个特定的小部件上绘制。

关于c++ - 如何在子部件而不是父部件上画一条线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42731889/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com