簡體   English   中英

如何使用QCustomPlot在Qt中繪制幾行圖形

[英]How to draw several lines of the graph in Qt using QCustomPlot

例如,在Visual Studio中有tChart及其Series屬性,它負責繪制圖形的線條。 以下是此代碼的示例

for (int j = 1; j < Nt - 1; j++)
  {
   for (int i = 1; i < Nt - 1; i++)
    {
       chart2->Series["" + (j + 1).ToString()]->Points->AddXY(i, wht[j][i]);
    }
  }

並用很多線條繪制這個圖形。

在此輸入圖像描述

但我的任務是在Qt Creator轉移(因為在Qt Creator可能會提供很多機會)這段代碼

void MainWindow::drawdifnet(int Nt)
{
    int N=Nt;
    int N1=pow(N,2);
    QVector<double> x22(N), y22(N1); 
    int ii=0,jj=0;
    for (int j = 0; j < Nt ; j++)
            {
                for (int i = 0; i < Nt ; i++)
                {          
                    x22[jj]=i;
                    y22[ii]=wht[j][i];
                    ui->widget_2->addGraph();
                    ui->widget_2->graph(0)->setData(x22,y22);
                  ii++;
                }
                jj++;
    }
    ui->widget_2->xAxis->setLabel("OsX");
    ui->widget_2->yAxis->setLabel("OsY");
    ui->widget_2->xAxis->setRange(30,30);
    ui->widget_2->replot();
}

不能正常工作。 結果是空小部件

在第一個我用幫助調試器檢查QVectors數據在這張圖片中看到我的dinamic數組wht[j][i]在工作並加載到QVector yy[ii]

在此輸入圖像描述 在此輸入圖像描述

我認為循環中的問題。

在QtCustomPlot教程中解決此代碼的問題

ui->widget_2->graph(0)->setData(x,y);
ui->widget_2->graph(1)->setData(x11,y11);
ui->widget_2->graph(2)->setData(x22,y22);

但在我的情況下,線程的數量是在程序工作時知道的。

我如何創建和分配我的數組

void created(int Nt, int Nx) ///This function creating my dynamic array
{
    wht = new double *[Nt];
    for (int i = 0; i < Nt; i++)
        wht[i] = new double[Nx];
}

inline double fn(int T, double x) ///these 4 functions for my mathematical part(works good)
{
    if (x >= 0)
        return T;
    return 0;
}

inline double u0(int T, double x)
{
    return fn(T, x);
}

inline double u1(int T, double a, int xmin, double t)
{
    return fn(T, xmin - a * t);
}

inline double u2(int T, double a, int xmax, double t)
{
    return fn(T, xmax - a * t);
}


void calculatedifnet(int xmin, double hx, double ht, double a, int Nx, int Nt, int T)
//These main function.We have the empty array and in this function we fill array. Then we solve in the main loop and the fill the first indexes wht[j]
{
    for (int i = 0; i < Nt; i++)
    {
        wht[0][i] = u0(T, xmin + i*hx);//fill the second indexeswht[null][i]
    }

    for (int j = 0; j < Nt - 1; j++)//the calculated code(works right).The result writing in wht[j]
    {
        wht[j + 1][0] = u1(T, a, xmin, j*ht);
        for (int i = 1; i < Nt; i++)
        {
            double dudx = (wht[j][i] - wht[j][i - 1]) / hx;
            wht[j + 1][i] = -a * dudx * ht + wht[j][i];
        }
    }
} 

在您的代碼中存在以下錯誤:

  • 如果我們觀察x是從0Nt-1的常量向量,那么我們只需要創建一次:

QVector<double> x(Nt);
for (int i = 0; i < Nt ; i++)
    x[i]=i;//0 to Nt-1
  • addGraph()添加一個圖形並將其放在最后一個位置,如果你想要圖形,你必須通過最后一個索引而不是索引0來訪問:

ui->widget_2->addGraph()->setData(xx, yy);
  • 假設wht的類型為QVector<QVector<double>>和大小的NtxNt ,然后是沒有必要的訪問的每個元素,我們可以訪問每個QVector<double>因為該函數setData()接受為輸入這種類型的數據。 對於函數setData()你必須傳遞2個相同大小的向量,但是你傳遞了NtNt*Nt 2個向量,這會產生一個警告:

ui->widget_2->addGraph()->setData(x, wht[j]);
  • setRange()將范圍從a放到b,但是如果它們是相同的,QCustomPlot將永遠不適合范圍,對於我的測試,我將其設置如下:

ui->widget_2->xAxis->setRange(0,Nt);
ui->widget_2->yAxis->setRange(0,Nt*Nt);

簡而言之,代碼如下:

void MainWindow::drawdifnet(int Nt){

    QVector<double> x(Nt);
    for (int i = 0; i < Nt ; i++)
        x[i]=i;//0 to Nt-1

    for (int j = 0; j < Nt ; j++)
        ui->widget_2->addGraph()->setData(x, wht[j]);

    /* if c++11
    for (auto& row: wht)
        ui->widget_2->addGraph()->setData(x, row);
    */

    ui->widget_2->xAxis->setLabel("OsX");
    ui->widget_2->yAxis->setLabel("OsY");
    ui->widget_2->xAxis->setRange(0,Nt);
    ui->widget_2->yAxis->setRange(0,Nt*Nt);
    ui->widget_2->replot();

}

輸出:

在此輸入圖像描述

注意:對於測試wht[i][j] = i*j

在你的情況下, whtdouble**類型的變量,也假設Nx>=Nt ,為此必須使用以下代碼:

void MainWindow::drawdifnet(int Nt)
{
    QVector<double> x(Nt);
    for (int i = 0; i < Nt ; i++){
        x[i]=i;//0 to Nt-1
    }

    QVector<double> y(Nt);
    for(int i=0; i<Nt; i++){
        for(int j=0; j<Nt; j++){
            y[j] = wht[i][j];
        }
        ui->widget_2->addGraph()->setData(x, y);
    }

    ui->widget_2->xAxis->setLabel("OsX");
    ui->widget_2->yAxis->setLabel("OsY");
    ui->widget_2->xAxis->setRange(0,12);
    ui->widget_2->yAxis->setRange(0,3.5);
    ui->widget_2->replot();
}

輸入:

  • 創造(12,12);
  • calculatedifnet(1,.5,.5,0.9,12,12,3);

輸出:

在此輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM