#include "mainwindow.h"
#include <QMenuBar>
#include <QGraphicsItem>
#include <QHBoxLayout>
#include <QPushButton>
#include <QLabel>
#include <QLineEdit>
#include <QGridLayout>
#include <qwt_plot_curve.h>
#include <stdio.h>
#include "paintview.h"
#include "utility.h"
MainWindow::MainWindow()
{
// 初始化变量
init();
// 创建菜单栏
createMenus();
// 设置布局
setMainLayout();
setWindowTitle("School Work");
}
/** 初始化成员变量 **/
void MainWindow::init()
{
_paintView = new PaintView();
_clearAct = new QAction("&Clear",this);
_exitAct = new QAction("&Exit",this);
_button = new QPushButton("Let's do it");
_button->setMinimumHeight(40);
_button->setMaximumWidth(200);
// 信号\槽连接
connect(_clearAct,SIGNAL(triggered()),this,SLOT(slotClear()));
connect(_exitAct,SIGNAL(triggered()),this,SLOT(close()));
connect(_button,SIGNAL(clicked()),this,SLOT(slotDraw()));
}
/** 创建菜单栏 **/
void MainWindow::createMenus()
{
QMenu *fileMenu = menuBar()->addMenu("File");
fileMenu->addAction(_clearAct);
fileMenu->addAction(_exitAct);
}
/** 设置布局 **/
void MainWindow::setMainLayout()
{
// 设置左上侧布局
// 创建6个输入框
for(int i=0;i<6;i++)
_arrCoord[i] = new QLineEdit();
// 创建3个标签
QLabel *point1 = new QLabel("point A : ");
QLabel *point2 = new QLabel("point B : ");
QLabel *point3 = new QLabel("point C : ");
// 插入布局
QGridLayout *coordLayout = new QGridLayout();
coordLayout->addWidget(point1,0,0);
coordLayout->addWidget(_arrCoord[0],1,0);
coordLayout->addWidget(_arrCoord[1],1,1);
coordLayout->addWidget(point2,2,0);
coordLayout->addWidget(_arrCoord[2],3,0);
coordLayout->addWidget(_arrCoord[3],3,1);
coordLayout->addWidget(point3,4,0);
coordLayout->addWidget(_arrCoord[4],5,0);
coordLayout->addWidget(_arrCoord[5],5,1);
// 用QFrame使3个标签和6个输入框作为一个整体
QFrame *frame1 = new QFrame();
frame1->setLayout(coordLayout);
frame1->setMinimumWidth(150);
frame1->setMaximumWidth(200);
// 设置左下侧布局
// 创建3个标签
_triangleStats = new QLabel("Triangle : \n\tA ()\n\tB ()\n\tC ()");
_incircleStats = new QLabel("\nIncirclee : \n\tcenter ()\n\tradius = ");
_circumcircleStats = new QLabel("\nCircumcirc : \n\tcenter ()\n\tradius = ");
// 插入布局
QVBoxLayout *statsLayout = new QVBoxLayout();
statsLayout->setContentsMargins(10,10,10,10);
statsLayout->addWidget(_triangleStats);
statsLayout->addWidget(_incircleStats);
statsLayout->addWidget(_circumcircleStats);
// 用QFrame是标签作为整体,QFrame是一个容器,可以设置自己的显示外观
QFrame *frame2 = new QFrame();
frame2->setFrameShape(QFrame::StyledPanel);
frame2->setFrameShadow(QFrame::Raised);
frame2->setLayout(statsLayout);
// 通过QVBoxLayout使其布局紧凑(因为它的addStretch方法)
QVBoxLayout *leftLayout = new QVBoxLayout;
leftLayout->addWidget(frame1);
leftLayout->setSpacing(20);
leftLayout->addWidget(_button);
leftLayout->addWidget(frame2);
leftLayout->addStretch();
QHBoxLayout *mainLayout = new QHBoxLayout();
mainLayout->setSpacing(20);
mainLayout->addLayout(leftLayout);
mainLayout->addWidget(_paintView);
QWidget *widget = new QWidget();
widget->setLayout(mainLayout);
setCentralWidget(widget);
}
/** 槽:清空函数 **/
void MainWindow::slotClear()
{
// 清除所有item
_paintView->detachItems(QwtPlotItem::Rtti_PlotItem);
// 再画上x=0和y=0辅助线
_paintView->drawXYLines();
_paintView->replot();
// 清空编辑框
for(int i=0;i<6;i++)
_arrCoord[i]->setText("");
// 更新状态区信息
_triangleStats->setText("Triangle : \n\tA ()\n\tB ()\n\tC ()");
_incircleStats->setText("\nIncirclee : \n\tcenter ()\n\tradius = ");
_circumcircleStats->setText("\nCircumcirc : \n\tcenter ()\n\tradius = ");
}
/** 槽:获取用户输入的三个点坐标并绘图 **/
void MainWindow::slotDraw()
{
// 先清空视图
_paintView->detachItems(QwtPlotItem::Rtti_PlotItem);
// 再画上x=0和y=0辅助线
_paintView->drawXYLines();
_paintView->replot();
double x1 = _arrCoord[0]->text().toDouble();
double y1 = _arrCoord[1]->text().toDouble();
double x2 = _arrCoord[2]->text().toDouble();
double y2 = _arrCoord[3]->text().toDouble();
double x3 = _arrCoord[4]->text().toDouble();
double y3 = _arrCoord[5]->text().toDouble();
// 画三角形的三个顶点
QPointF p1(x1, y1);
QPointF p2(x2,y2);
QPointF p3(x3,y3);
_paintView->drawPointsOfTriangle(p1, p2, p3);
// 画三角形的三条边
double xval[] = {x1,x2,x3,x1};
double yval[] = {y1,y2,y3,y1};
_paintView->drawEdgesOfTriangle(xval, yval);
// 更新状态区三角形信息
QString info = "Triangle : ";
info.append("\n A ( " + QString::number(x1) + " , " + QString::number(y1) + " )");
info.append("\n B ( " + QString::number(x2) + " , " + QString::number(y2) + " )");
info.append("\n C ( " + QString::number(x3) + " , " + QString::number(y3) + " )");
_triangleStats->setText(info);
// 三点共线
if((y3-y1)/(x3-x1)==(y2-y1)/(x2-x1))
{
// 更新状态区内切圆和外接圆信息
info = "\nIncircle : \n\tno incircle";
_incircleStats->setText(info);
info = "\ncircumcircle : \n\tno circumcircle";
_circumcircleStats->setText(info);
return;
}
// 画内切圆
QPointF incircleCenter = Utility::caculateIncircleCenter(x1,y1,x2,y2,x3,y3);
double incircleRadius = Utility::caculateIncircleRadius(x1,y1,x2,y2,x3,y3);
_paintView->drawInscribedCircle(incircleCenter,incircleRadius);
// 画外接圆
QPointF circumcircleCenter = Utility::caculateCircumcircleCenter(x1,y1,x2,y2,x3,y3);
double circumcircleRadius = Utility::caculateCircumcircleRadius(x1,y1,x2,y2,x3,y3);
_paintView->drawCircumscribedCircle(circumcircleCenter,circumcircleRadius);
_paintView->replot();
// 更新状态区域的内切圆和外接圆信息
info = "\nIncircle : ";
info.append("\n center ( " + QString::number(incircleCenter.x()) + " , " + QString::number(incircleCenter.y()) + " )");
info.append("\n radius = " + QString::number(incircleRadius));
_incircleStats->setText(info);
info = "\ncircumcircle : ";
info.append("\n center ( " + QString::number(circumcircleCenter.x()) + " , " + QString::number(circumcircleCenter.y()) + " )");
info.append("\n radius = " + QString::number(circumcircleRadius));
_circumcircleStats->setText(info);
}
- 1
- 2
- 3
- 4
前往页