Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. How to make a graph.
Forum Updated to NodeBB v4.3 + New Features

How to make a graph.

Scheduled Pinned Locked Moved General and Desktop
5 Posts 4 Posters 2.3k Views 3 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • BREEZE_KOB Offline
    BREEZE_KOB Offline
    BREEZE_KO
    wrote on last edited by
    #1

    I have a function make a graph in MFC.
    But I don't know how to convert MFC to Qt.

    This function is so simple.
    Just draw the graph using CPaint.
    but it receive the rect to draw using GetWindowRect and ScreenToClient.
    and set CDC.

    I want to know about how to convert the above process.

    void drawGraph() {
    CCPerfusionDemoDoc *pDoc = GetDocument();
    
    	if (pDoc->m_pVoxels == NULL || m_ComboSelMask.GetCurSel() == LB_ERR || m_bIsInit==false)
    		return;
    
    	float VoxelHUMax, VoxelHUMin, VoxelHURange; 
    	int VoxelHUMaxIndex;
    
    	int w_headinterval = WIDTHINTERVAL + 50, w_backinterval = WIDTHINTERVAL, h_headinterval = HEIGHTINTERVAL + 20, h_backinterval = HEIGHTINTERVAL + 30;
    
    	int n = pDoc->m_iFrameNumber - 1;
    
    	VoxelHUMax = m_fVoxelHU[0];
    	VoxelHUMin = m_fVoxelHU[0];
    	VoxelHUMaxIndex = 0;
    
    	for (int i = 0; i <= n; i++)
    	{
    		if (VoxelHUMax < m_fVoxelHU[i])
    			VoxelHUMax = m_fVoxelHU[i];
    
    		if (VoxelHUMin > m_fVoxelHU[i])
    			VoxelHUMin = m_fVoxelHU[i];
    		/////Max value
    		if (m_fArteryAvgHU[VoxelHUMaxIndex] < m_fVoxelHU[i])
    		{
    			VoxelHUMaxIndex = i;
    		}
    	}
    	VoxelHURange = VoxelHUMax - VoxelHUMin;
    
    	CRect rect;
    	**m_StaticTempTDC.GetWindowRect(&rect);
    	ScreenToClient(&rect);**
    
    	int width = rect.Width();
    	int height = rect.Height();
    	width = width - w_backinterval - w_headinterval;
    
    	**CDC* pDC = m_StaticTempTDC.GetDC();**
    
    	double dt = pDoc->m_pVoxels[n]->m_fImageTime - pDoc->m_pVoxels[0]->m_fImageTime;
    	double dRatioWidth = (double)(width) / dt;
    
    	CPen VoxelPen(PS_SOLID, 1, RGB(0, 0, 255));
    	CPen VoxelDotPen(PS_DOT, 1, RGB(0, 0, 255));
    	CPen GridPen(PS_DOT, 1, RGB(0, 0, 0));
    	CPen *pOldPen = pDC->SelectObject(&VoxelPen);
    	
    
    	//// Grid
    	double y;
    	for (int i = 0; i <= 10; i++)
    	{
    		pDC->SelectObject(&GridPen);
    		y = (double)(height - h_headinterval - h_backinterval) / 10 * i;
    		pDC->MoveTo(w_headinterval, height - h_backinterval - y);
    		pDC->LineTo(width + w_headinterval, height - h_backinterval - y);
    	}
    
    	double x1, x2, y1, y2;
    	//y = (height / (Max - Min))*(Data - Min):크기비율
    	for (int i = 0; i < n; i++)
    	{
    		pDC->SelectObject(&VoxelPen);
    
    		dt = pDoc->m_pVoxels[i]->m_fImageTime - pDoc->m_pVoxels[0]->m_fImageTime;
    		x1 = dt * dRatioWidth + w_headinterval;
    		dt = pDoc->m_pVoxels[i + 1]->m_fImageTime - pDoc->m_pVoxels[0]->m_fImageTime;
    		x2 = dt * dRatioWidth + w_headinterval;
    
    		y1 = (height - h_headinterval - h_backinterval) / VoxelHURange * (m_fVoxelHU[i] - VoxelHUMin );
    		y2 = (height - h_headinterval - h_backinterval) / VoxelHURange * (m_fVoxelHU[i + 1] - VoxelHUMin );
    
    		pDC->MoveTo(x1, height - h_backinterval - y1);
    		pDC->LineTo(x2, height - h_backinterval - y2);
    	}
    	// grid y-axis
    	for (int i = 0; i <= n; i++)
    	{
    		pDC->SelectObject(&VoxelDotPen);
    
    		dt = pDoc->m_pVoxels[i]->m_fImageTime - pDoc->m_pVoxels[0]->m_fImageTime;
    
    		pDC->MoveTo(dt * dRatioWidth + w_headinterval, height - h_backinterval);
    		pDC->LineTo(dt * dRatioWidth + w_headinterval,
    			height - h_backinterval - (((height - h_headinterval - h_backinterval) / VoxelHURange) * (m_fVoxelHU[i] - VoxelHUMin)));
    	}
    
    	// draw text
    	CFont font;
    	font.CreateFont(13, 0, 0, 0, FW_NORMAL, 0, 0, 0, 0, 0, 0, 0, 0, _T("Arial"));
    	CFont* oldfont = pDC->SelectObject(&font);
    
    	double VoxelInterval = VoxelHURange / 10;
    	double Voxel = VoxelHUMax;
    	
    	for (int i = 0; i <= 10; i++)
    	{
    		CString scale;
    
    		scale.Format("%0.3f", Voxel);
    
    		Voxel -= VoxelInterval;
    
    		pDC->TextOutA(10, h_headinterval + ((height - h_headinterval - h_backinterval) / 10)*i, scale);
    
    	}
    	for (int i = 0; i <= n;i++)
    	{
    		dt = pDoc->m_pVoxels[i]->m_fImageTime - pDoc->m_pVoxels[0]->m_fImageTime;
    		x1 = dt * dRatioWidth;
    
    		CString temp;
    		temp.Format("%0.1f", dt);
    
    		if (int(dt) / 10)
    			pDC->TextOutA(x1 + w_headinterval - 12, height - h_backinterval + 10, temp);
    		else
    			pDC->TextOutA(x1 + w_headinterval - 9, height - h_backinterval + 10, temp);
    	}
    	pDC->SelectObject(oldfont);
    	font.DeleteObject();
    
    	DeleteObject(&pOldPen);
    	DeleteObject(VoxelPen);
    	DeleteObject(GridPen);
    	DeleteObject(VoxelDotPen);
    	ReleaseDC(pDC);
    
    Joel BodenmannJ 1 Reply Last reply
    0
    • BREEZE_KOB BREEZE_KO

      I have a function make a graph in MFC.
      But I don't know how to convert MFC to Qt.

      This function is so simple.
      Just draw the graph using CPaint.
      but it receive the rect to draw using GetWindowRect and ScreenToClient.
      and set CDC.

      I want to know about how to convert the above process.

      void drawGraph() {
      CCPerfusionDemoDoc *pDoc = GetDocument();
      
      	if (pDoc->m_pVoxels == NULL || m_ComboSelMask.GetCurSel() == LB_ERR || m_bIsInit==false)
      		return;
      
      	float VoxelHUMax, VoxelHUMin, VoxelHURange; 
      	int VoxelHUMaxIndex;
      
      	int w_headinterval = WIDTHINTERVAL + 50, w_backinterval = WIDTHINTERVAL, h_headinterval = HEIGHTINTERVAL + 20, h_backinterval = HEIGHTINTERVAL + 30;
      
      	int n = pDoc->m_iFrameNumber - 1;
      
      	VoxelHUMax = m_fVoxelHU[0];
      	VoxelHUMin = m_fVoxelHU[0];
      	VoxelHUMaxIndex = 0;
      
      	for (int i = 0; i <= n; i++)
      	{
      		if (VoxelHUMax < m_fVoxelHU[i])
      			VoxelHUMax = m_fVoxelHU[i];
      
      		if (VoxelHUMin > m_fVoxelHU[i])
      			VoxelHUMin = m_fVoxelHU[i];
      		/////Max value
      		if (m_fArteryAvgHU[VoxelHUMaxIndex] < m_fVoxelHU[i])
      		{
      			VoxelHUMaxIndex = i;
      		}
      	}
      	VoxelHURange = VoxelHUMax - VoxelHUMin;
      
      	CRect rect;
      	**m_StaticTempTDC.GetWindowRect(&rect);
      	ScreenToClient(&rect);**
      
      	int width = rect.Width();
      	int height = rect.Height();
      	width = width - w_backinterval - w_headinterval;
      
      	**CDC* pDC = m_StaticTempTDC.GetDC();**
      
      	double dt = pDoc->m_pVoxels[n]->m_fImageTime - pDoc->m_pVoxels[0]->m_fImageTime;
      	double dRatioWidth = (double)(width) / dt;
      
      	CPen VoxelPen(PS_SOLID, 1, RGB(0, 0, 255));
      	CPen VoxelDotPen(PS_DOT, 1, RGB(0, 0, 255));
      	CPen GridPen(PS_DOT, 1, RGB(0, 0, 0));
      	CPen *pOldPen = pDC->SelectObject(&VoxelPen);
      	
      
      	//// Grid
      	double y;
      	for (int i = 0; i <= 10; i++)
      	{
      		pDC->SelectObject(&GridPen);
      		y = (double)(height - h_headinterval - h_backinterval) / 10 * i;
      		pDC->MoveTo(w_headinterval, height - h_backinterval - y);
      		pDC->LineTo(width + w_headinterval, height - h_backinterval - y);
      	}
      
      	double x1, x2, y1, y2;
      	//y = (height / (Max - Min))*(Data - Min):크기비율
      	for (int i = 0; i < n; i++)
      	{
      		pDC->SelectObject(&VoxelPen);
      
      		dt = pDoc->m_pVoxels[i]->m_fImageTime - pDoc->m_pVoxels[0]->m_fImageTime;
      		x1 = dt * dRatioWidth + w_headinterval;
      		dt = pDoc->m_pVoxels[i + 1]->m_fImageTime - pDoc->m_pVoxels[0]->m_fImageTime;
      		x2 = dt * dRatioWidth + w_headinterval;
      
      		y1 = (height - h_headinterval - h_backinterval) / VoxelHURange * (m_fVoxelHU[i] - VoxelHUMin );
      		y2 = (height - h_headinterval - h_backinterval) / VoxelHURange * (m_fVoxelHU[i + 1] - VoxelHUMin );
      
      		pDC->MoveTo(x1, height - h_backinterval - y1);
      		pDC->LineTo(x2, height - h_backinterval - y2);
      	}
      	// grid y-axis
      	for (int i = 0; i <= n; i++)
      	{
      		pDC->SelectObject(&VoxelDotPen);
      
      		dt = pDoc->m_pVoxels[i]->m_fImageTime - pDoc->m_pVoxels[0]->m_fImageTime;
      
      		pDC->MoveTo(dt * dRatioWidth + w_headinterval, height - h_backinterval);
      		pDC->LineTo(dt * dRatioWidth + w_headinterval,
      			height - h_backinterval - (((height - h_headinterval - h_backinterval) / VoxelHURange) * (m_fVoxelHU[i] - VoxelHUMin)));
      	}
      
      	// draw text
      	CFont font;
      	font.CreateFont(13, 0, 0, 0, FW_NORMAL, 0, 0, 0, 0, 0, 0, 0, 0, _T("Arial"));
      	CFont* oldfont = pDC->SelectObject(&font);
      
      	double VoxelInterval = VoxelHURange / 10;
      	double Voxel = VoxelHUMax;
      	
      	for (int i = 0; i <= 10; i++)
      	{
      		CString scale;
      
      		scale.Format("%0.3f", Voxel);
      
      		Voxel -= VoxelInterval;
      
      		pDC->TextOutA(10, h_headinterval + ((height - h_headinterval - h_backinterval) / 10)*i, scale);
      
      	}
      	for (int i = 0; i <= n;i++)
      	{
      		dt = pDoc->m_pVoxels[i]->m_fImageTime - pDoc->m_pVoxels[0]->m_fImageTime;
      		x1 = dt * dRatioWidth;
      
      		CString temp;
      		temp.Format("%0.1f", dt);
      
      		if (int(dt) / 10)
      			pDC->TextOutA(x1 + w_headinterval - 12, height - h_backinterval + 10, temp);
      		else
      			pDC->TextOutA(x1 + w_headinterval - 9, height - h_backinterval + 10, temp);
      	}
      	pDC->SelectObject(oldfont);
      	font.DeleteObject();
      
      	DeleteObject(&pOldPen);
      	DeleteObject(VoxelPen);
      	DeleteObject(GridPen);
      	DeleteObject(VoxelDotPen);
      	ReleaseDC(pDC);
      
      Joel BodenmannJ Offline
      Joel BodenmannJ Offline
      Joel Bodenmann
      wrote on last edited by
      #2

      I don't know whether this really answers your question but unlike you use the fancy new Qt stuff you can either use QCustomPlot or Qwt to render plots. There might be of course other solutions but these are the most commonly used ones.

      Industrial process automation software: https://simulton.com
      Embedded Graphics & GUI library: https://ugfx.io

      1 Reply Last reply
      2
      • mrjjM Offline
        mrjjM Offline
        mrjj
        Lifetime Qt Champion
        wrote on last edited by mrjj
        #3

        @BREEZE_KO said:

        pDC

        well you need a widget and override its paintEvent
        there you use QPainter which acts like the HDC.

        instead of
        pDC->SelectObject(oldfont);
        you use
        thepainter.setFont
        setPen
        setBrush etc

        http://doc.qt.io/qt-5/qpainter.html

        BREEZE_KOB 1 Reply Last reply
        5
        • mrjjM mrjj

          @BREEZE_KO said:

          pDC

          well you need a widget and override its paintEvent
          there you use QPainter which acts like the HDC.

          instead of
          pDC->SelectObject(oldfont);
          you use
          thepainter.setFont
          setPen
          setBrush etc

          http://doc.qt.io/qt-5/qpainter.html

          BREEZE_KOB Offline
          BREEZE_KOB Offline
          BREEZE_KO
          wrote on last edited by BREEZE_KO
          #4

          @mrjj

          If I set up a mainWindow composed of layouts and I want to draw the line chart with QPainter in first layout,
          how can I set up a place QPainter is drawing?

          simple source

          MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
          {
              ui->setupUi(this);
              QWidget* mainWidget = new QWidget(this);
              this->setCentralWidget(mainWidget);
          
              QGridLayout* mainLayout = new QGridLayout();
          
              QGroupBox* gbox1 = new QGroupBox;
              QGroupBox* gbox2 = new QGroupBox;
          
              mainLayout->addWidget(gbox1);
              mainLayout->addWidget(gbox2);
              mainWidget->setLayout(mainLayout);
          
              //canvas
              QGridLayout* layout1 = new QGridLayout;
             
          **    QPainter paint(this); // ???**
          
          K 1 Reply Last reply
          0
          • BREEZE_KOB BREEZE_KO

            @mrjj

            If I set up a mainWindow composed of layouts and I want to draw the line chart with QPainter in first layout,
            how can I set up a place QPainter is drawing?

            simple source

            MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
            {
                ui->setupUi(this);
                QWidget* mainWidget = new QWidget(this);
                this->setCentralWidget(mainWidget);
            
                QGridLayout* mainLayout = new QGridLayout();
            
                QGroupBox* gbox1 = new QGroupBox;
                QGroupBox* gbox2 = new QGroupBox;
            
                mainLayout->addWidget(gbox1);
                mainLayout->addWidget(gbox2);
                mainWidget->setLayout(mainLayout);
            
                //canvas
                QGridLayout* layout1 = new QGridLayout;
               
            **    QPainter paint(this); // ???**
            
            K Offline
            K Offline
            kenchan
            wrote on last edited by
            #5

            @BREEZE_KO
            As @mrjj suggested, I think you can just add a widget that you will use as your "canvas" to the layout and override it's paint event to draw what you want it to draw with a painter.

              void MyWidget::paintEvent(QPaintEvent *)
              {
                  QPainter p;
                  p.begin(this);
                  p.drawLine(...);        // drawing code
                  p.end();
              }
            

            You can find plenty of docs and samples about this kind of thing.
            you could start here : http://doc.qt.io/qt-5/qpainter.htm

            1 Reply Last reply
            0

            • Login

            • Login or register to search.
            • First post
              Last post
            0
            • Categories
            • Recent
            • Tags
            • Popular
            • Users
            • Groups
            • Search
            • Get Qt Extensions
            • Unsolved