Qt 座標軸 平滑曲線 貝塞爾曲線


ui頭文件

/********************************************************************************
** Form generated from reading UI file 'mainwindow.ui'
**
** Created by: Qt User Interface Compiler version 5.4.1
**
** WARNING! All changes made in this file will be lost when recompiling UI file!
********************************************************************************/

#ifndef UI_MAINWINDOW_H
#define UI_MAINWINDOW_H

#include <QtCore/QVariant>
#include <QtWidgets/QAction>
#include <QtWidgets/QApplication>
#include <QtWidgets/QButtonGroup>
#include <QtWidgets/QGraphicsView>
#include <QtWidgets/QHeaderView>
#include <QtWidgets/QLabel>
#include <QtWidgets/QLineEdit>
#include <QtWidgets/QMainWindow>
#include <QtWidgets/QPushButton>
#include <QtWidgets/QTextEdit>
#include <QtWidgets/QVBoxLayout>
#include <QtWidgets/QWidget>

QT_BEGIN_NAMESPACE

class Ui_MainWindow
{
public:
    QWidget *centralWidget;
    QPushButton *pushButton;
    QPushButton *pushButton_2;
    QPushButton *pushButton_3;
    QTextEdit *textEdit;
    QLabel *label;
    QLabel *label_2;
    QLineEdit *lineEdit;
    QLineEdit *lineEdit_2;
    QPushButton *pushButton_4;
    QWidget *verticalLayoutWidget;
    QVBoxLayout *verticalLayout;
    QGraphicsView *graphicsView;

    void setupUi(QMainWindow *MainWindow)
    {
        if (MainWindow->objectName().isEmpty())
            MainWindow->setObjectName(QStringLiteral("MainWindow"));
        MainWindow->resize(711, 420);
        MainWindow->setMinimumSize(QSize(711, 420));
        MainWindow->setMaximumSize(QSize(711, 420));
        MainWindow->setSizeIncrement(QSize(711, 420));
        MainWindow->setBaseSize(QSize(711, 420));
        centralWidget = new QWidget(MainWindow);
        centralWidget->setObjectName(QStringLiteral("centralWidget"));
        pushButton = new QPushButton(centralWidget);
        pushButton->setObjectName(QStringLiteral("pushButton"));
        pushButton->setGeometry(QRect(20, 340, 21, 23));
        pushButton_2 = new QPushButton(centralWidget);
        pushButton_2->setObjectName(QStringLiteral("pushButton_2"));
        pushButton_2->setGeometry(QRect(50, 340, 21, 23));
        pushButton_3 = new QPushButton(centralWidget);
        pushButton_3->setObjectName(QStringLiteral("pushButton_3"));
        pushButton_3->setGeometry(QRect(20, 380, 51, 23));
        textEdit = new QTextEdit(centralWidget);
        textEdit->setObjectName(QStringLiteral("textEdit"));
        textEdit->setGeometry(QRect(290, 330, 421, 91));
        label = new QLabel(centralWidget);
        label->setObjectName(QStringLiteral("label"));
        label->setGeometry(QRect(121, 340, 16, 16));
        label_2 = new QLabel(centralWidget);
        label_2->setObjectName(QStringLiteral("label_2"));
        label_2->setGeometry(QRect(121, 357, 16, 16));
        lineEdit = new QLineEdit(centralWidget);
        lineEdit->setObjectName(QStringLiteral("lineEdit"));
        lineEdit->setGeometry(QRect(139, 340, 91, 20));
        lineEdit_2 = new QLineEdit(centralWidget);
        lineEdit_2->setObjectName(QStringLiteral("lineEdit_2"));
        lineEdit_2->setGeometry(QRect(139, 357, 91, 20));
        pushButton_4 = new QPushButton(centralWidget);
        pushButton_4->setObjectName(QStringLiteral("pushButton_4"));
        pushButton_4->setGeometry(QRect(140, 380, 75, 23));
        verticalLayoutWidget = new QWidget(centralWidget);
        verticalLayoutWidget->setObjectName(QStringLiteral("verticalLayoutWidget"));
        verticalLayoutWidget->setGeometry(QRect(0, 0, 711, 331));
        verticalLayout = new QVBoxLayout(verticalLayoutWidget);
        verticalLayout->setSpacing(6);
        verticalLayout->setContentsMargins(11, 11, 11, 11);
        verticalLayout->setObjectName(QStringLiteral("verticalLayout"));
        verticalLayout->setContentsMargins(0, 0, 0, 0);
        graphicsView = new QGraphicsView(verticalLayoutWidget);
        graphicsView->setObjectName(QStringLiteral("graphicsView"));

        verticalLayout->addWidget(graphicsView);

        MainWindow->setCentralWidget(centralWidget);

        retranslateUi(MainWindow);

        QMetaObject::connectSlotsByName(MainWindow);
    } // setupUi

    void retranslateUi(QMainWindow *MainWindow)
    {
        MainWindow->setWindowTitle(QApplication::translate("MainWindow", "MainWindow", 0));
        pushButton->setText(QApplication::translate("MainWindow", "-", 0));
        pushButton_2->setText(QApplication::translate("MainWindow", "+", 0));
        pushButton_3->setText(QApplication::translate("MainWindow", "build", 0));
        label->setText(QApplication::translate("MainWindow", "x:", 0));
        label_2->setText(QApplication::translate("MainWindow", "y:", 0));
        pushButton_4->setText(QApplication::translate("MainWindow", "addpoint", 0));
    } // retranslateUi

};

namespace Ui {
    class MainWindow: public Ui_MainWindow {};
} // namespace Ui

QT_END_NAMESPACE

#endif // UI_MAINWINDOW_H
窗體頭文件:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include"ui_mainwindow.h"
namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    //void paintEvent(QPaintEvent *e);
    ~MainWindow();


private slots:
    void on_pushButton_4_clicked();

    void on_pushButton_2_clicked();



    void on_pushButton_clicked();

    void on_pushButton_3_clicked();

private:
    Ui::MainWindow *ui;
protected:
    //void paintEvent ( QPaintEvent * event );
    //virtual void paintEvent(QPaintEvent *event);
};

/*class testView : public QGraphicsView
{
    Q_OBJECT

public:
    testView(QWidget* parent = NULL);
    ~testView();

private slots:
    void slot_update();
};
*/
class testScene : public QGraphicsScene
{
    Q_OBJECT

public:
    testScene();
    ~testScene();

private slots:
    void slot_update();

protected:
    virtual void drawBackground(QPainter *painter, const QRectF &rect);
    virtual void drawForeground(QPainter *painter, const QRectF &rect);

private:
    QPainterPath mPath;
};
#endif // MAINWINDOW_H
儲存點的頭文件
#ifndef POINTSAVE
#define POINTSAVE

class Pointtt
{
public:
    struct po
    {
        double x;
        double y;
        struct po *next;
    };
private:
     struct po *cc;
     struct po head;


public:
     Pointtt();
     struct po rehead();
    void AddPoint(double xx,double yy);

};

#endif // POINTSAVE
窗體源文件
#include "pointsave.h"
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QString>
#include<QGraphicsView>
#include<QGraphicsScene>
#include<QGraphicsLineItem>
#include<QGraphicsPathItem>
#include <QtGui>
#include <QCompleter>
#include <QTest>
using   namespace   std;
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->verticalLayout->addWidget(ui->graphicsView);

    testScene* scene = new testScene();

    connect(ui->pushButton_3, SIGNAL(clicked()), scene, SLOT(slot_update()));
    //connect(ui->pushButton_3, SIGNAL(clicked()), ui->graphicsView, SLOT(slot_update()));

    ui->graphicsView->setScene(scene);

}
/*MainWindow::paintEvent(QPaintEvent *event)
{
    QWidget::paintEvent(event);
   // QMainWindow
}*/

MainWindow::~MainWindow()
{
    delete ui;

}
testScene::testScene()
{
    setSceneRect(QRectF(0,0,2000,600));


}

testScene::~testScene()
{

}

void testScene::drawBackground( QPainter *painter, const QRectF &rect )
{


    painter->save();

    painter->setBrush(Qt::darkCyan);
    painter->drawRect(rect);

    painter->setPen(Qt::yellow);
    const double w = sceneRect().width();
    const double h = sceneRect().height();
    QLineF line(QPointF(1,h),QPointF(w,h));
    painter->drawLine(line);
    QLineF line1(QPointF(1,h),QPointF(1,0));
    painter->drawLine(line1);
    for(int i=h; i>0; i-=100)
    {
        QLineF line(QPointF(1,i),QPointF(w,i));
        painter->drawLine(line);
    }
     for(int i=1;i<w;i+=100)
     {
         QLineF line(QPointF(i,0),QPointF(i,h));
         painter->drawLine(line);
     }
    painter->restore();
}

void testScene::drawForeground( QPainter *painter, const QRectF &rect )
{
    //qDebug()<<"drawForeground";

    painter->save();

    painter->setPen(QPen(Qt::red,5));
    painter->drawPath(mPath);

    painter->restore();
}

void testScene::slot_update()
{
      //qsrand(QTime::currentTime().msec());
    extern Pointtt point;

        Pointtt::po *dd;
        Pointtt::po *ddd;
        dd=&point.rehead();
        dd=dd->next;
    mPath = QPainterPath();
    mPath.moveTo(dd->x,sceneRect().height()-dd->y);
    for(ddd=dd->next;ddd!=nullptr;ddd=ddd->next)
    {
        QPoint c1((dd->x+ddd->x)/2,sceneRect().height()-dd->y);
        QPoint c2((dd->x+ddd->x)/2,sceneRect().height()-ddd->y);
        QPoint end(ddd->x,sceneRect().height()-ddd->y);
           mPath.cubicTo(c1 ,c2 ,end );
         //ui->graphicsView->scene()->addLine((-340+dd->x),(150-dd->y),(-340+ddd->x),(150-ddd->y));
         dd=dd->next;
    }

    double w = sceneRect().width();
    double h = sceneRect().height();
    double step = w/10;

    for(int i=0; i<w; i+=step)
    {
        update (i,0,step,h);
     // QTest::qSleep(100);
     // //  qDebug()<<"scene update()"<<i;
   }
}

/*void testView::slot_update()
{
    //double w = rect().width();
    //double h = rect().height();
    //double step = w/10;

    //for(int i=0; i<w; i+=step)
    //{
    //  update (i,0,step,h);
    //  //QTest::qSleep(1000);
    //  qDebug()<<"view update()"<<i;
    //}
}
*/
//testView::testView( QWidget* parent /*= NULL*/ )
  /*  : QGraphicsView(parent)
{
    centerOn(0,0);

    setCacheMode(QGraphicsView::CacheBackground);
    setRenderHint(QPainter::Antialiasing, true);
    //setRenderHint(QPainter::TextAntialiasing, true);
    setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
}

testView::~testView()
{

}*/
void MainWindow::on_pushButton_4_clicked()
{
   extern Pointtt point;
    point.AddPoint(ui->lineEdit->text().toDouble(),ui->lineEdit_2->text().toDouble());
    ui->textEdit->moveCursor(QTextCursor::End);
    ui->textEdit->textCursor().insertText(ui->lineEdit->text()+","+ui->lineEdit_2->text()+";   \t");
    //ui->textEdit->append(ui->lineEdit->text()+","+ui->lineEdit_2->text()+";");
      ui->lineEdit->setText("");
      ui->lineEdit_2->setText("");
    Pointtt::po  *pdd;
     pdd=&point.rehead();

    // ui->textEdit->setText(QString::number(pdd->next->x));

}

void MainWindow::on_pushButton_2_clicked()
{
    ui->graphicsView->scale(1.25,1.25);
}



void MainWindow::on_pushButton_clicked()
{
    ui->graphicsView->scale(0.75,0.75);
}

/*void MainWindow::paintEvent(QPaintEvent *e)
{QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing,true);
QPen pen;
pen.setColor(Qt::red);
pen.setWidth(2);
pen.setStyle(Qt::DashDotLine);
painter.setPen(pen);

//define startpos endpos
QPoint start_pos(300,50);
QPoint end_pos(100,200);

//drawPath;

QPainterPath path(start_pos);

QPoint c1((start_pos+end_pos).x()/2,start_pos.y());
QPoint c2((start_pos+end_pos).x()/2,end_pos.y());

path.cubicTo(c1 ,c2 ,end_pos );



painter.drawPath(path);


QPen penshaper;
penshaper.setStyle(Qt::SolidLine);
penshaper.setColor(Qt::darkRed);
painter.setPen(penshaper);

//#define the rect size;

QSize rect_size(60,60);
QRect rect_shape1(start_pos-QPoint(rect_size.height()/2,rect_size.width()/2),rect_size);
QRect rect_shape2(end_pos-QPoint(rect_size.height()/2,rect_size.width()/2),rect_size);

QBrush brush(Qt::darkGray,Qt::CrossPattern);
painter.fillRect(rect_shape1,brush);
painter.fillRect(rect_shape2,brush);
painter.drawRoundedRect(rect_shape1,10,10);
painter.drawRoundedRect(rect_shape2,10,10);

QPen dotpen;
dotpen.setWidth(8);
dotpen.setColor(Qt::red);

brush.setStyle(Qt::SolidPattern);
painter.setPen(dotpen);
painter.drawPoint(start_pos);
painter.drawPoint(end_pos);
}*/
void MainWindow::on_pushButton_3_clicked()
{
    /*extern Pointtt point;
    extern QGraphicsScene scene;
    Pointtt::po *dd;
    Pointtt::po *ddd;
    //ui->graphicsView->scene()->clear();
    dd=&point.rehead();
    for(ddd=dd->next;ddd!=nullptr;ddd=ddd->next)
    {
         ui->graphicsView->scene()->addLine((-340+dd->x),(150-dd->y),(-340+ddd->x),(150-ddd->y));
         dd=dd->next;
    }*/
}
儲存點源文件
#include"pointsave.h"
Pointtt point;

void Pointtt ::AddPoint(double xx,double yy)
{
    po *p;
    p=new  po;
    p->x =xx;
    p->y=yy;
     po *f;
    f=&head;
    for(cc=head.next;cc!=nullptr;cc=cc->next)
    {
        if(p->x<cc->x)
        {
             po *u;
            u=f->next;
            f->next=p;
            p->next=u;
            return ;
        }
        f=f->next;
    }
    f->next=p;
    p->next=nullptr;
}
Pointtt::Pointtt()
{
    this->head.x=0;
    this->head.y=0;
    this->head.next=nullptr;
}

Pointtt::po Pointtt::rehead()
{
    return this->head;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章