Problems with Open-Source Downloads read https://www.qt.io/blog/problem-with-open-source-downloads and https://forum.qt.io/post/638946

How can i draw a QImage via QPixmap on my Widged



  • Hello,

    I want to fill a QImage via setPixel() with three different colors: green, red and blue. After this I want to convert the image into a pixmap: QPixmap :: from image (myImage) and draw the pixmap with my painter myPainter.drawPixmap (pixmap) on the widged.

    Problem: The program runs without errors but nothing has been drawn....

    Here is code:
    @void MainWindow::paintEvent(QPaintEvent *)
    {
    //TmpAttr
    int xSize = _world->getWorldSize().first;
    int ySize = _world->getWorldSize().second;
    QRect playingField(10, 10, xSize, ySize);

    enum type
    {
    fish = 1,
    shark = 2,
    water = 3,
    error = 255
    };
    
    QPainter myPainter(this);
    myPainter.fillRect(playingField, Qt::blue);
    
    QImage testImage(playingField.size(), QImage::Format_Indexed8);
    QVector<QRgb> _colors(256);
    _colors[fish] = Qt::green;
    _colors[shark] = Qt::red;
    _colors[water] = Qt::blue;
    _colors[error] = Qt::yellow;
    testImage.setColorTable(_colors);
    
    //Zeichne Pixel
    for(int x = 0; x < xSize; x++)
    {
        for (int y = 0; y < ySize; y++)
        {
            //std::cout << "Offset: " << counter << " Type: " << _world->getIndividumType(x, y) << std::endl;
            counter ++;
            
            switch (_world->getIndividumType(x, y))
            {
                case 1: //fish
                    testImage.setPixel(x, y, fish);
                    fishCounter++;
                    break;
                case 2: //shark
                    testImage.setPixel(x, y, shark);
                    sharkCouner++;
                    break;
                case 3: //water
                    testImage.setPixel(x, y, water);
                    waterCounter++;
                    break;
                default: //error
                    testImage.setPixel(x, y, error);
                    std::cout << "Error at: " << x << " " << y << std::endl;
                    break;
            }//end switch
        }//end for y
    }//end for x
    
    myPainter.drawPixmap(playingField, QPixmap::fromImage(testImage));
    

    }//end paint@

    Can anyone help me?


  • Lifetime Qt Champion

    Hi and welcome to devnet,

    Not a direct answer to your question but it seems that you are complicating things, why not use a QLabel and set your pixmap on it ? You could update your counters using timerEvent and call update.

    As for your question, what kind of widget is your MainWindow ?



  • Whats the different between setting a pixmap on a Label and setting it on the widget itself? Did u have a excample for the the timerEvent?

    How can i see what kind of widget i have?

    Sorry but im realy new to qt :)



  • No idea anyone, why nothing is drawn?


  • Lifetime Qt Champion

    The QLabel handles the painting part for you :)

    @class MainWindow : public QWidget <- or QMainWindow etc...@

    You can see how to use it in "QObject::startTimer":http://qt-project.org/doc/qt-4.8/qobject.html#startTimer

    Also, I just checked the "QImage's documentation":http://qt-project.org/doc/qt-4.8/qimage.html#Format-enum drawing on a Format_Indexed8 image is not supported



  • A few remarks:
    I would recommend against doing the actual work generating the QImage in the paintEvent itself. The paintEvent needs to be fast, and your routine is making it slow. I would generate the image in another method and call update() on the widget when a repaint is needed based on the new image.

    You can also directly render a QImage. It depends on your platform if converting to QPixmap first (once, instead of in every call to paintEvent!) has speed benefits.


Log in to reply