Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

QPainter error in GUI application

I'm trying to write a GUI that paints a graph onto it in C++. I am getting a list of errors, all of which say: "QPainter::begin: Widget painting can onnly begin as a result of a paintEvent" Nothing appears to be painting.

main.cpp

#include <QApplication>
#include <QFont>
#include <QPushButton>
#include <iostream>

using namespace std;

#include "skewNormal.h"
#include "ui.h"

int main(int argc, char* argv[])
{
    QApplication app(argc, argv);
    Window w;
    #if defined(Q_OS_SYMBIAN)
    w.showMaximized();
    #else
    w.show();
    #endif
    return app.exec();
}

ui.h

#ifndef UI_H_INCLUDED
#define UI_H_INCLUDED
#include <QtGui/QMainWindow>

class Window : public QWidget
{
    public:
    Window();

    void paintEvent ( QPaintEvent * event );
};



#endif // UI_H_INCLUDED

ui.cpp

#ifndef GRAPHPN3670_H
#define GRAPHPN3670_H

#include <QtCore/QVariant>
#include <QtGui/QAction>
#include <QtGui/QApplication>
#include <QtGui/QPaintEvent>
#include <QtGui/QGraphicsView>
#include <QtGui/QHeaderView>
#include <QtGui/QMainWindow>
#include <QtGui/QMenuBar>
#include <QtGui/QStatusBar>
#include <QtGui/QWidget>
#include <QtCore/QRect>
#include <iostream>

using namespace std;

#include "ui.h"
#include "skewNormal.h"

Window::Window()
{
    cout<<"Hello1";
}

void Window::paintEvent ( QPaintEvent * event ){
    cout<<"Hello from paint event";
    QPainter p(this);
    int xL = -width() / 2;
    int yL = 0;
    for(int x = -width() / 2; x < width() / 2; x++)
    {
        int y = getSkewNormal(0.5, x);
        p.drawLine(xL + width() / 2, height() - yL, x + width() / 2, height() - y);
        xL = x;
        yL = y;
    }
}

#endif // GRAPHPE3488_H
like image 905
Ryan Amos Avatar asked Dec 22 '22 12:12

Ryan Amos


2 Answers

From the Qt documentation:

Warning: When the paintdevice is a widget, QPainter can only be used inside a paintEvent() function or in a function called by paintEvent(); that is unless the Qt::WA_PaintOutsidePaintEvent widget attribute is set. On Mac OS X and Windows, you can only paint in a paintEvent() function regardless of this attribute's setting.

like image 146
Steve S Avatar answered Dec 28 '22 08:12

Steve S


You're not doing widget painting correctly.

The proper thing way to do it is like this;

// Add this method to your widget class
virtual void paintEvent(QPaintEvent * e)
{
   QPainter p(this);
   // Add all calls to p.drawPoint(), etc here
}

... and that is the only place you should be using QPainter. Then, whenever you want your widget to repaint itself, call update() on your widget, and Qt will call paintEvent() for you shortly afterwards.

like image 31
Jeremy Friesner Avatar answered Dec 28 '22 09:12

Jeremy Friesner