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. QHash insert problem
Qt 6.11 is out! See what's new in the release blog

QHash insert problem

Scheduled Pinned Locked Moved Unsolved General and Desktop
2 Posts 2 Posters 1.1k Views 1 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.
  • P Offline
    P Offline
    PierreThb
    wrote on last edited by PierreThb
    #1

    Hi everyone, I'm trying to compile my code through a project for my IT (which consistes to implement a typing test in C++). Here the tstatswpm.h of my class tstatswpm:

    #ifndef TSTATSWPM_H
    #define TSTATSWPM_H
    
    using namespace std;
    
    #include <QWidget>
    #include <QPainter>
    #include <QMouseEvent>
    #include <QEvent>
    
    #include <stdlib.h>
    #include <time.h>
    #include <iostream>
    
    #include "Data/tuser.h"
    #include "Data/texercice.h"
    #include "Data/tresult.h"
    
    
    class TStatsWPM: public QWidget
    {
    public:
        TStatsWPM(TUser *user=0, QWidget *parent=0);
    
    protected:
        void paintEvent(QPaintEvent *e);
        void createRandomYPoints();
        void mouseMoveEvent(QMouseEvent * e);
        void mousePressEvent(QMouseEvent *e);
    
    private:
        TUser *user_;
        float mean_ = 0;
        int ypoints_[]; 
        QHash<QPoint *,QRect> rectpoint_;
    };
    
    #endif // TSTATSWPM_H
    

    Here the tstatswpm.cpp:

    #include "tstatswpm.h"
    
    TStatsWPM::TStatsWPM(TUser *user, QWidget *parent):
        QWidget(parent),
        user_(user),
        rectpoint_(QHash<QPoint *,QRect>())
    {
        setFocus();
        setMouseTracking(true);
    }
    
    void TStatsWPM::createRandomYPoints(){
        int val;
    
        srand (time(NULL));
        this->ypoints_[0] = 300; 
    
        for(int i = 1; i<19; i++){
            val  = rand() % 300 + 1;
            this->ypoints_[i] = 300 - val;
        }
    
        this->ypoints_[19] = 300; 
    }
    
    void TStatsWPM::paintEvent(QPaintEvent *e){
    
        createRandomYPoints();
    
        QPainter p;
        QPen pen;
        p.begin(this);
        p.setBrush(Qt::cyan);
        p.setPen(Qt::NoPen);
        static QPoint *points = (QPoint*)malloc(sizeof(QPoint)*20);
    
        points[0] = QPoint(0,300);
    
        for(int i=1;i<19;i++){
            if(i==1){
                QPoint *point = new QPoint(0, ypoints_[i]);
                points[i] = *point;
                QRect rect(0,0,24,300);
                rectpoint_.insert(point,rect);
            }else{
                QPoint *point = new QPoint(i*50, ypoints_[i]);
                points[i] = *point;
                QRect rect((i*50)-25,0,48,300);
                rectpoint_.insert(point,rect);
            }
        }
        points[19] = QPoint(18*50,300);
    
        p.drawPolygon(points,20);
    
        pen.setBrush(Qt::white);
        pen.setWidth(6);
        p.setPen(pen);
        p.drawPoints(points,20);
        p.end();
    }
    
    void TStatsWPM::mouseMoveEvent(QMouseEvent *e){
        cout << e->x() << "," << e->y() << endl;
    }
    
    void TStatsWPM::mousePressEvent(QMouseEvent *e){
        cout << "click" << endl;
    }
    

    The problem is that i can't insert in my QHash in lines:

                rectpoint_.insert(point,rect);
    

    Everything is compiling but the program crashed instantly. The loop,

     for(int i=1;i<19;i++){
            if(i==1){
                QPoint *point = new QPoint(0, ypoints_[i]);
                points[i] = *point;
                QRect rect(0,0,24,300);
                rectpoint_.insert(point,rect);
            }else{
                QPoint *point = new QPoint(i*50, ypoints_[i]);
                points[i] = *point;
                QRect rect((i*50)-25,0,48,300);
                rectpoint_.insert(point,rect);
            }
        }
    

    is not going further than i = 1 and crashed at the insert (everything is working when i remove it).
    Do you think the problem comes from my constructor ?

    TStatsWPM::TStatsWPM(TUser *user, QWidget *parent):
        QWidget(parent),
        user_(user),
        rectpoint_(QHash<QPoint *,QRect>())
    {
        setFocus();
        setMouseTracking(true);
    }
    

    line :

     rectpoint_(QHash<QPoint *,QRect>())
    

    If someone has an idea about this I would be very grateful.

    Pierre

    1 Reply Last reply
    0
    • kshegunovK Offline
      kshegunovK Offline
      kshegunov
      Moderators
      wrote on last edited by kshegunov
      #2

      Hello,
      Well, I think you have multitude of problems with that code, and I also believe it has nothing to do with the QHash itself. The most obvious thing I see is it that you're writing beyond your memory block and you're making a bloody mess of the heap. Look here:

      class TStatsWPM: public QWidget
      {
          // ...
          int ypoints_[]; //< !!!
      }
      
      void TStatsWPM::createRandomYPoints()
      {
          // ...
          this->ypoints_[0] = 300; //< !!!
         
          for(int i = 1; i<19; i++)  {
              // ...
              this->ypoints_[i] = 300 - val;
              // ...
          }
      }
      

      Who's supposed to initialize the TStatsWPM::ypoints_ member before you start writing onto it? I don't see such code in your example. And this:

      static QPoint *points = (QPoint*)malloc(sizeof(QPoint)*20);
      

      Is very dubious, to say the least. What's the problem with using QHash<QPoint, QRect>? Not to mention that no one is cleaning up that malloc-ated memory ...

      To sum up, use QPoint objects, don't create static arrays (or objects) with malloc. If you want to have an array, use new instead. Free up the memory you're allocating.

      Kind regards.

      Read and abide by the Qt Code of Conduct

      1 Reply Last reply
      1

      • Login

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