gpt4 book ai didi

c++ - Qt 中基本图形应用程序中的填充函数

转载 作者:行者123 更新时间:2023-11-28 02:36:18 25 4
gpt4 key购买 nike

我一直在用简单的 GUI 创建一个基本的图形程序(比如 MS Paint)。我有两个类,其中一个是包含所有按钮、 slider 等的 MainWindow,第二个类是一个名为 drawingArea 的自定义小部件,用户可以在其上绘制。基本上我已经实现了大部分功能,但不幸的是我坚持使用填充功能,它应该像 MS Paint 中的一样工作。我决定使用所谓的 floodFill 算法,经过几个小时的战斗(我是 Qt 的初学者)我设法让它工作。但一点也不。问题是我只能用我选择的颜色填充黑色区域(形状、线条、点等)。但是当涉及到填充不同的颜色时,它只是将一个像素放入选定的颜色中。在下面的 funcion fill(...) 中,我传递了两个参数 - point(mouseClicked) 和该点的颜色。这里:

void drawingArea::fill(const QPoint &point, QColor act)
{
QPainter painter(&image);
QPen myPen(actualColor);
myPen.setWidth(1);
painter.setPen(myPen);

QQueue<QPoint> pixels;
pixels.enqueue(point);
while(pixels.isEmpty() == 0)
{
QPoint newPoint = pixels.dequeue();
QColor actual;
actual.fromRgb(image.pixel(newPoint));
if(actual == act)
{
painter.drawPoint(newPoint);
update();

QPoint left((newPoint.x()-1), newPoint.y());
if(left.x() >0 && left.x() < image.width() && image.pixel(left) == act.rgb())
{
pixels.enqueue(left);
painter.drawPoint(left);
update();
}

QPoint right((newPoint.x()+1), newPoint.y());
if(right.x() > 0 && right.x() < image.width() && image.pixel(right) == act.rgb())
{
pixels.enqueue(right);
painter.drawPoint(right);
update();
}

QPoint up((newPoint.x()), (newPoint.y()-1));
if(up.y() > 0 && up.y() < image.height() && image.pixel(up) == act.rgb())
{
pixels.enqueue(up);
painter.drawPoint(up);
update();
}

QPoint down((newPoint.x()), (newPoint.y()+1));
if(down.y() > 0 && down.y() < image.height() && image.pixel(down) == act.rgb())
{
pixels.enqueue(down);
painter.drawPoint(down);
update();
}
}
}
}

我在这里调用 mousePressEvent 中的 fill(...) 函数:

void drawingArea::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton)
{
lastPoint = event->pos();
QColor clr;
clr.fromRgb(image.pixel(lastPoint));
firstPoint = event->pos();
isDrawing = true;
if(isColorcheck) colorcheck(lastPoint);
if(isFill) fill(lastPoint,clr);
}
}

当传递不同颜色的参数 QColor 时,真的不明白它是如何只对黑色起作用的。如果有任何帮助或想法,我将不胜感激。

最佳答案

您的代码存在根本问题。不要只从类中调用的任何方法进行绘图。绘图需要在您定义的绘制事件回调中完成。 QWidget::paintEvent值得探索。

void MyClass::paintEvent(QPaintEvent *event)
{
// do the drawing depending on the context and you may
// define that context in other event handlers, etc.
}

除此之外很难说还有什么问题。顺便说一句,您可以通过 repaint() 或 update() 触发绘图事件。您需要考虑如何在代码中定义重绘的确切区域。

关于c++ - Qt 中基本图形应用程序中的填充函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27322573/

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