graphische Darstellung der Werte einer Matrix mit Qt



  • Hallo zusammen!
    Ich bastle gerade an meinem ersten Qt-Projekt, und möchte gerne eine Matrix/ein Array graphisch darstellen.Ich wühle mich schon den ganzen Tag durch Qt-Klassen, und finde nicht was ich suche.
    Die Matrix ist 2D, die Werte sind nur 0 und 1... Das sollte doch eigentlich problemlos darstellbar sein? Alles was ich finde ist die Einbindung von Bildern (zb. jpg, png etc...). Dabei wird doch sicher auch das Bild in etwas zumindest matrixähnliches umgerechnet?
    Weiss schon gar nicht mehr, wo ich suchen soll. Wahrscheinlich bin ich schon 10x drüber gestolpert und habs nicht gemerkt...
    lG,
    Kerstin



  • Du solltest dir selbst klar werden, wie du die Matrix darstellen möchtest und dann schauen, wie man das mit Qt realisiert.

    Zum Beispiel hat eine Tabelle etwas matrixartiges an sich und kann mit einem QTableWidget dargestellt werden.

    Eine andere Möglichkeit wäre, dass du ein Bild der Matrix malst und das dann in einem QLabel darstellst.



  • Ich hab mir Folgendes überlegt:
    Die Matrix könnte so aussehen:
    1 0 1
    0 1 0
    1 0 1

    1 soll schwarz sein, 0 weiss.
    Könnte man dann so umsetzen?

    QImage image(xmax,ymax,QImage::Format_Indexed8);
    QRgb value;
    
    value=qRgb(1,1,1);	
    image.setColor(0,value);
    
    value=qRgb(0,0,0); 
    image.setColor(1,value);
    
    for(int i=0;i<xmax;i++)
    {
    	for(int j=0;j<ymax;j++)
    	{
    		image.setPixel(i,j,array[i][j]);
    	}
    }
    


  • Kerstin81 schrieb:

    Ich hab mir Folgendes überlegt:
    Die Matrix könnte so aussehen:
    1 0 1
    0 1 0
    1 0 1

    1 soll schwarz sein, 0 weiss.
    Könnte man dann so umsetzen?

    QImage image(xmax,ymax,QImage::Format_Indexed8);
    QRgb value;
    
    value=qRgb(1,1,1);	
    image.setColor(0,value);
    
    value=qRgb(0,0,0); 
    image.setColor(1,value);
    
    for(int i=0;i<xmax;i++)
    {
    	for(int j=0;j<ymax;j++)
    	{
    		image.setPixel(i,j,array[i][j]);
    	}
    }
    

    Das wird passen, aber ein Pixel pro Feld ist ein bisschen wenig, oder?
    8x8 wäre doch sichtbarer.



  • Klar, ein Pixel ist ein bisschen wenig 😉 Ich dachte dran, das QImage noch zu skalieren.
    Momentan sieht mein Programmschnipsel so aus:

    QImage * image = new QImage(5,5,QImage::Format_Indexed8);
    	QPixmap pixmap;
    	QLabel * label = new QLabel();
    
    	QRgb value;
    
    	int array[5][5]={{1,0,1,0,1},{0,1,0,1,0},{1,0,1,0,1},{0,1,0,1,0},{1,0,1,0,1}};
    
    	value=qRgb(255,255,255);
    	image->setColor(0,value);
    
    	value=qRgb(0,0,0);
    	image->setColor(1,value);
    
    	for(int i=0;i<5;i++)
    	{
    		for(int j=0;j<5;j++)
    		{
    			image->setPixel(i,j,array[i][j]);
    		}
    	}
    	QImage scaledImage = image->scaled(300,300,Qt::IgnoreAspectRatio,Qt::FastTransformation);
    	pixmap=QPixmap::fromImage(scaledImage);
    	label->setPixmap(pixmap);
    	label->show();
    

    Allerdings bekomme ich dann nur ein neues Fenster, das mit Hintergrundfarbe gefüllt ist, nicht mit schwarz und weiss 😕 Funktioniert das mit dem Skalieren nicht so wie ich mir das vorstelle, dass die einzelnen Pixel aufgeblasen werden?
    Und ich hätte die Darstellung gern in meinem Hauptfenster, nicht in nem Extra-Fenster. Wie sage ich dem Programm das?



  • #include <QtCore>
    #include <QtGui>
    
    int main(int argc, char *argv[])
    {
       QApplication app(argc, argv);
    
       int array[5][5]={{1,0,1,0,1},{0,1,0,1,0},{1,0,1,0,1},{0,1,0,1,0},{1,0,1,0,1}};
    
       QImage * image = new QImage(5,5,QImage::Format_Indexed8);
    
       image->setNumColors(2);
       image->setColor(0, qRgb(255,255,255));
       image->setColor(1, qRgb(  0,  0,  0));
    
       for(int i=0;i<5;i++) {
          for(int j=0;j<5;j++) {
                image->setPixel(i,j,array[i][j]);
          }
       }
    
       QImage scaledImage = image->scaled(300,300,Qt::IgnoreAspectRatio,Qt::FastTransformation);
    
       QLabel * label = new QLabel();
       label->setPixmap(QPixmap::fromImage(scaledImage));
       label->show();
       app.exec();
    }
    

    Es fehlt das setNumColors(2).

    Wenn das Label im Hauptfenster angezeigt werden soll, dann muss man es auch in das Hauptfester hinzufügen. Aber vielleicht hat das Hauptfenster schon ein Label, dass nur noch das Bild anzeigen soll.



  • Das mit den schwarzen und weissen Pixeln klappt jetzt super! Danke!
    Aber wie ich das alles in das Hauptfenster bringe hab ich noch nicht verstanden. Ich hab momentan ein main, aus dem eine andere Klasse aufgerufen wird, die für die Verwaltung der einzelnen Bauteile zuständig ist, und eine Klasse fürs Zeichnen. Nun muss das Label irgendwie von der Zeichnen-Klasse in die Verwaltung wandern. Aber wie stell ich das an? Das ist wohl ne ziemlich einfache Frage, aber wie gesagt, ich hab mich bisher noch nie mit Qt beschäftigt...



  • Man übergibt das Fenster, das das Lebel enthalten soll, dem Label beim Konstruieren:

    label = new QLabel(parent);
    


  • Aha! 💡
    Jetzt siehts so aus wie ich mir das gedacht hatte. Vielen Dank!


Log in to reply