#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