使用Qt画史密斯圆图的问题

#include "mainwindow.h"
#include "ui_mainwindow.h"


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    ui->splitter->setStretchFactor(0,20);
    ui->splitter->setStretchFactor(1,1);
    ui->w_polar->installEventFilter(this);

}

MainWindow::~MainWindow()
{
    delete ui;
}

bool MainWindow::eventFilter(QObject *watched, QEvent *event)
{
    if(watched == ui->w_polar&&event->type() == QEvent::Paint)
    {
        painter.begin(ui->w_polar);
        draw_full(painter);
        painter.end();
    }
    return QWidget::eventFilter(watched,event);
}
double MainWindow::radius()
{
    double r=ui->w_polar->width()/2;
    if(ui->w_polar->height()/2.0 < r)
        r=ui->w_polar->height()/2.;
    r -= margin;
    qDebug()<<"<<<radius  r:"<<r;
    return r;
}

QPointF MainWindow::val_to_point(QPointF center, double r, complex<double> val)
{
    return QPointF(center.x()+val.real()/scale*r,center.y()-val.imag()/scale*r);
}

//smith chart 坐标系
void MainWindow::draw_grid(QPainter &painter)
{
    QPointF center(ui->w_polar->width()/2,ui->w_polar->height()/2);   //使用浮点数定义平面上的坐标点
    double r=radius();

    // draw outer circle
    painter.setPen(QPen(Qt::black, 2.0));  //设置画笔颜色宽度
    painter.drawEllipse(center,r,r);

//    painter.setPen(QPen(QColor(50,50,50), 1.0));
    painter.setPen(QPen(Qt::black, 1.0));

    // draw constant resistance circles   画等电阻圆
    for(int i=1;i<4;i++)
    {
        painter.drawEllipse(center+QPointF(r-r/4*i,0),r/4*i,r/4*i);
    }

    // draw constant reactance circles   画等电抗圆
    painter.save();
    QPainterPath path;    //绘画容器  使得图形形状能够被构造和重用
    path.addEllipse(center,r,r);
    painter.setClipPath(path);    //启用剪贴  在指定范围内显示
    int n=1;
    for(int i=1;i<5;i++)
    {
        painter.drawEllipse(center+QPointF(r,r/2*n), r/2*n, r/2*n);
        painter.drawEllipse(center+QPointF(r,-r/2*n), r/2*n, r/2*n);
        n*=2;
    }
    painter.restore();  //恢复painter状态

    // draw center line
    painter.drawLine(center-QPointF(r,0), center+QPointF(r,0));
}

void MainWindow::draw_chart(QPainter &painter)
{
    if(points.size()==0) return;
    QPointF center(ui->w_polar->width()/2,ui->w_polar->height()/2);
    double r=radius();
    for(int i=1; i < int(points.size()); i++)
    {
        if(std::isnan(points[i-1].real()) || std::isnan(points[i].real()))
            continue;
        painter.drawLine(val_to_point(center,r,points[i-1]),val_to_point(center,r,points[i]));

    }
}

//绘制
void MainWindow::draw_chart(QPainter &painter, const std::complex<double> &data)
{
    qDebug()<<"<<<draw_chart";
    if(smith_Points.size()==0) return;
    QPointF center(ui->w_polar->width()/2,ui->w_polar->height()/2);
    double r=radius();

    for(int i=1; i < int(smith_Points.size()); i++)
    {
        if(std::isnan(smith_Points.at(i-1).real()) || std::isnan(smith_Points.at(i).real()))   //C和C++11标准提供了类似于isnan、isfinite、isinf、isnormal、fpclassify分别用于判断是非数(NaN)值、有限制、无穷值、正常数值等
            continue;
        painter.drawLine(val_to_point(center,r,smith_Points.at(i-1)),val_to_point(center,r,smith_Points.at(i)));
            qDebug()<<"smith_Points.size()"<<smith_Points.size()<<val_to_point(center,r,smith_Points.at(i-1));
    }
}




void MainWindow::draw_full(QPainter &painter)
{
    painter.setRenderHints(QPainter::Antialiasing);
    painter.fillRect(rect(),Qt::white);    //背景颜色
    draw_grid(painter);
    if(persistence)
    {
        painter.drawImage(0,0,image);
    }
    else
    {
        painter.setPen(QPen(Qt::blue, 2.0));
//        draw_chart(painter);
        complex<double> cpl;
        draw_chart(painter,cpl);
    }
    for(Marker marker:markers)
    {
        if(marker.index<0) continue;
        painter.setPen(QPen(QColor(marker.color), 2.0));
        draw_point(painter,points.at(marker.index),3);
    }
}

void MainWindow::draw_point(QPainter &painter, complex<double> pt, double size)
{
    QPointF center(ui->w_polar->width()/2,ui->w_polar->height()/2);
    double r=radius();
    painter.drawEllipse(val_to_point(center,r,pt), size, size);
}

void MainWindow::clearPersistence()
{
    image=QImage(ui->w_polar->size(),QImage::Format_ARGB32);
}


//void MainWindow::paintEvent(QPaintEvent *)
//{
////    QPainter painter(this);
////    draw_full(painter);
//    qDebug()<<"被调用";
//}


QList<std::complex<double> > MainWindow::readDataFromTxt(const QString &Path)
{
    if(Path.isEmpty())
    {
        QList<std::complex<double>> empty;
        return empty;
    }
    QString readString;
    QList<QString> readListString;
    QList<double> readListdouble;
    QList<std::complex<double>> readList;

    QFile file(Path);
    if(file.open(QIODevice::ReadOnly|QIODevice::Text))
    {
        readString = file.readAll();
        readListString << readString.split(";");

        qDebug()<<"readListStringcount:"<<readListString.count()<<readListString;

        file.close();
    }
    else
    {
        qDebug()<<"Open file Fail:"<<file.errorString();
        file.close();
    }
    for(int i =0; i<readListString.count()-1;i++)
    {

        QList<QString> temp;
        temp<<readListString.at(i).split(",");
        qDebug()<<temp;
        double real = temp.at(0).toDouble();
        double imag = temp.at(1).toDouble();
        std::complex<double> cplx(real,imag);
        readList.append(cplx);
    }
    myDebug(readList,"readList--");
    return   readList;
}

//自定义打印输出信息的接口
void MainWindow::myDebug(QList<std::complex<double> > &list,QString str_show)
{
    if(list.isEmpty())
    {
        qDebug() << "( complex list is empty )";
        return;
    }

    QList<QString> show_list;
    for(int i = 0;i < list.size();i++)
    {
        std::complex<double> temp = list.at(i);
        show_list << QString("%3[real = %1,imag =%2]").arg(temp.real(),5).arg(temp.imag(),5).arg(i);
    }
    qDebug() << "自定义打印输出 " << str_show << show_list;
}


QList<double> MainWindow::takeMold_cplx(const QList<std::complex<double> > &cplx)
{
    if(cplx.isEmpty())
    {
        QList<double> empty;
        return empty ;
    }
    QList<double> result;

    for(int i = 0;i<cplx.size();i++)
    {
        double temp;
        temp = cplx.at(i).real()*cplx.at(i).real()+cplx.at(i).imag()*cplx.at(i).imag();
        temp = sqrt(temp);
        result<<temp;
    }
    return result;
}

void MainWindow::writeDataToTxt(const QList<std::complex<double> > &data, const QString &Path)
{
    if(data.isEmpty()&&Path.isEmpty())
    {
        return;
    }
    QString writlist;

    QFile file(Path);
    file.remove();
    if(file.open(QIODevice::WriteOnly))
    {
        for(int i = 0;i<data.size();i++)
        {
            std::complex<double> temp = data.at(i);
            writlist += QString("%1,%2;").arg(temp.real(),5).arg(temp.imag(),5);
        }
        file.write(writlist.toLocal8Bit());
        file.close();
    }
    else
    {
        qDebug()<<"Open file Fail:"<<file.errorString();
        file.close();
    }
}

void MainWindow::writeDataToTxt(const QList<double> &data, const QString &Path,const QString &Header)
{
    if(data.isEmpty()&&Path.isEmpty())
    {
        return;
    }
    QString writlist;
    writlist = Header + QDateTime::currentDateTime().toString("yyyy-MM-dd_hh:mm:ss----");
    QFile file(Path);
    if(file.open(QIODevice::ReadWrite|QIODevice::Append))
    {
        for(int i = 0;i<data.size();i++)
        {
            writlist += QString("%1;").arg(data.at(i),5);
        }
        writlist +="\r\n";
        file.write(writlist.toLocal8Bit());
        file.close();
    }
    else
    {
        qDebug()<<"Open file Fail:"<<file.errorString();
        file.close();
    }
}

void MainWindow::on_pushButton_clicked()
{
    QList<std::complex<double>>  cplx;
    //打开一个数据txt文档
    QString fileName = QFileDialog::getOpenFileName(this,"打开文件");

     qDebug()<<fileName;
     if(!fileName.isEmpty())
     {
        cplx = readDataFromTxt(fileName);
        smith_Points<<cplx;
        draw_full(painter);
        myDebug(cplx,"cplx:");
        QList<double> mold;
        mold = takeMold_cplx(cplx);
        writeDataToTxt(mold,"result.txt","load:--");
        qDebug()<<"mold:"<<mold;
     }
     else
     {
         qDebug()<<"打开文件为空";
     }
}

这是一个使用Qt画史密斯圆图的程序,需要导入txt文件才能画出史密斯圆图,想问一下txt文件里要放什么样的数据才能画出来

你看看程序将txt的数据做了什么处理,反推过来就好了

您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632

看到你在问答里面提了一个问题 ,我有对应的课程专栏。希望能帮到你。
本人简介:https://blog.csdn.net/it_xiangqiang/article/details/115873169
QT完整教程:          https://blog.csdn.net/it_xiangqiang/category_10794527.html
QT项目实战完整教程:https://blog.csdn.net/it_xiangqiang/category_11050910.html

非常感谢您使用有问必答服务,为了后续更快速的帮您解决问题,现诚邀您参与有问必答体验反馈。您的建议将会运用到我们的产品优化中,希望能得到您的支持与协助!

速戳参与调研>>>https://t.csdnimg.cn/Kf0y