Create a matrix from a .csv file
-
@AliM93
well do you have that version of paint ?void MatrixWidget::paintEvent(QPaintEvent *event) { QPainter p(this); // draw frame. p.drawRect(0, 0, width() - 1, height() - 1); // size of area we have. w = width , h = height , we take 2 pixles for border int w = width() - 2; int h = height() - 2; // now we find out how big each box should be which area we have divided with how many on x and y bw = w / max_x; bh = h / max_y; // now we loop and drw the boxes for (int xi = 0; xi < max_x; ++xi) { for (int yi = 0; yi < max_x; ++yi) { p.drawRect( QRect( xi * bw, yi * bh, bw, bh ) ) ; p.drawText(QRect( xi * bw, yi * bh, bw, bh ), QString::number(xi + 1) + "," + QString::number(yi+1) ); // the +1 aswe dont want to use first at 0,0 } } }
-
@AliM93
Ok that good news as it would be very impossible that numbers went missing :)what is remaining is the click logic and to actual draw the 1.
how shall we draw 0 ones ?
just no value in cell and cant be selected or what is the goal? -
Yes its possible. we can paint it any way we like. teasers included.
Well im getting very tired as 4.20 in the morning is late for me even i do love programming at night.
Tomorrow we add the last part. It's not that much. Promise.
You did good. First custom widget is always a bit tuff. -
Hi
The last remaining steps are to
+Add box width/height as members to use when clicking and a variable to keep track of the number of selectedclass MatrixWidget : public QWidget {.... int bw =0; int bh =0; int selCount=0; // to make sure we can only select 3 ,...
+call loadData from construtor.
+Set some colors in void MatrixWidget::LoadData()
for 0 cells and 1 cells (see code)+Add selection logic to mousePress
void MatrixWidget::mousePressEvent(QMouseEvent *event) { QPoint p = event->pos(); // where we clicked int xindex = p.x() / bw; int yindex = p.y() / bh; qDebug() << xindex << " " << yindex; // get the data point ( we should check index is not outside array...) DataPoint &dp = Data[xindex + 1 ][yindex + 1]; // value zero cannot be selected if ( dp.value == 0 ) return; // selection logic. If not already selected, select it and set color. Else deselect and reset color if ( dp.isSelected == false) { // no more than 3 selected ( 0,1,2 ) if ( selCount > 2 ) return; dp.DrawColor = Qt::blue; dp.isSelected = true; selCount++; // extra selected } else { dp.DrawColor = Qt::green; dp.isSelected = false; selCount--; // less selected } update(); // tell it to redraw grid }
+Adjust draw to skip 0,0 as we don't use it but the array must start at zero.
void MatrixWidget::paintEvent(QPaintEvent *event) { QPainter p(this); // draw frame. p.drawRect(0, 0, width() - 1, height() - 1); // size of area we have. w = width , h = height , we take 2 pixles for border int w = width() - 2; int h = height() - 2; // now we find out how big each box should be which area we have divided with how many on x and y bw = w / max_x; bh = h / max_y; // now we loop and draw the boxes. we dont use the boxes from 0,0 as data starts with 1,1 for (int xi = 0; xi < max_x - 1; ++xi) { for (int yi = 0; yi < max_x - 1; ++yi) { p.setBrush(QBrush( Data[xi + 1][yi + 1].DrawColor )); // +1 as we dont want to use from 0,0 QRect cellRect( xi * bw, yi * bh, bw, bh ); p.drawRect( cellRect ); // show x,y . just for debug p.drawText( cellRect , QString::number(xi + 1) + "," + QString::number(yi +1) ); } } }
Then we have a working version.
project
https://www.dropbox.com/s/z4nllgag1tjy4j3/GridWidgetApp.zip?dl=0Things to improve/add
The limit of how many points user can select,
should be a parameter to the class so it can be set to anything and not a fixed value.The colors could also be parameters ( for not selectable, selectable and selected)
Add a function to return the selected data pointsby looping the Data list and check isSelected.
-
@AliM93 said in Create a matrix from a .csv file:
it, but when i run i got a black grid, and the error floating point exeption (core dumped)
In my project or yours ?
-