Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt 获取受drawLine()或QLineF影响的点列表_Qt_Qt4_Qpainter - Fatal编程技术网

Qt 获取受drawLine()或QLineF影响的点列表

Qt 获取受drawLine()或QLineF影响的点列表,qt,qt4,qpainter,Qt,Qt4,Qpainter,如何获取drawLine()函数影响的点/坐标列表?例如,如果我有 QLineF line(10.0, 80.0, 90.0, 20.0); QPainter(this); painter.drawLine(line); 我想得到drawLine()将绘制的QPoint坐标列表。我知道,但是我需要在更一般的情况下使用它,在这种情况下,我可以设置不同的QPen和QBrush: painter.setPen(QPen(myColor, myWidth, Qt::SolidLine, Qt::Rou

如何获取drawLine()函数影响的点/坐标列表?例如,如果我有

QLineF line(10.0, 80.0, 90.0, 20.0);
QPainter(this);
painter.drawLine(line);
我想得到drawLine()将绘制的QPoint坐标列表。我知道,但是我需要在更一般的情况下使用它,在这种情况下,我可以设置不同的QPen和QBrush:

painter.setPen(QPen(myColor, myWidth, Qt::SolidLine, Qt::RoundCap));
我还需要它与其他程序保持一致,这些程序可能会绘制具有相同端点和参数的直线,但没有Qt,因此我希望最终得到相同的结果,并且没有一个差

注意:这与不同,因为我需要受绘图功能影响的所有像素,而不仅仅是多边形/路径的顶点


更新:我认为可以将QImage或QPainterDevice和QPaintEngine子类化,以捕获所有“setPixel()”操作。有没有人能证明或者确认,甚至可以写一个简短的代码来实现这一点?

不确定您的性能要求,但您可以在屏幕外渲染线条,然后查看图像以查看绘制了哪些像素。下面是一个打印从190190到210210的400x400图像上3像素线之间绘制的像素的示例

使用QImage时,请确保出于性能原因使用scanLine()函数

#include <QCoreApplication>
#include <QImage>
#include <QPainter>
#include <QDebug>

int main(int argc, char *argv[])
{
    QImage image(400,400,QImage::Format_ARGB32);
    QPainter painter;
    painter.begin(&image);
    painter.fillRect(0,0,400,400,QBrush(Qt::white));
    QBrush brush(Qt::black);
    QPen pen(brush, 3.0);
    painter.setPen(pen);
    painter.drawLine(190,190,210,210);
    painter.end();

    for (int i=0;i<image.height();i++) {
        const uchar *scanLine = image.scanLine(i);
        for (int j=0;j<image.width()*4;j+=4) {
            if ( scanLine[j] == 0 ) {
                qDebug() << "pixel" << i << j/4 << scanLine[j];
            }
        }
    }

    return (0);
}
#包括
#包括
#包括
#包括
int main(int argc,char*argv[])
{
QImage图像(400400,QImage::格式_ARGB32);
油漆工;
画师。开始(&图像);
painter.fillRect(0,0400400,QBrush(Qt::白色));
QBrush刷(Qt::黑色);
QPen笔(刷子,3.0);
画师:画笔;
画师.画线(190210210);
结束();

对于(int i=0;i在Qt程序中覆盖的精确像素甚至不一定一致。如果在
QPainter
上启用抗锯齿,则情况会有所不同;如果绘制到
QGLWidget
,则情况会有所不同,并且可能会因程序运行的平台而异,因为Qt具有不同的<代码>QPaintEngine
不一定产生完全相同输出的实现


简言之,你所要求的是不可能的。你只能找到特定绘制操作所覆盖的像素,你只能通过mzelina建议的方法来实现这一点。

谢谢,但这还不够快。我需要将我的Qt GUI与matlab通信。因此发送像素坐标更好,我现在做的就是这样做是的,我只想让特定的绘制操作覆盖像素,我不需要不同版本/平台的像素相同,我只想使用Qt提供的可用渲染引擎,让特定的绘制操作覆盖像素。但我不认为mzelina的方法是唯一的方法解析,因为我希望(QImage->data)不是由QPainter直接访问的。