Ошибка QPainter в приложении с графическим интерфейсом - PullRequest
4 голосов
/ 09 июня 2011

Я пытаюсь написать графический интерфейс, который рисует график на нем в C ++. Я получаю список ошибок, все из которых говорят: «QPainter :: begin: рисование виджета может начаться только в результате paintEvent» Ничто, кажется, не рисует.

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

Ответы [ 4 ]

4 голосов
/ 10 июня 2011

Из документации Qt :

Предупреждение: когда устройство покраски виджет, QPainter можно использовать только внутри функции paintEvent () или в функция вызывается paintEvent (); тот если только Виджет Qt :: WA_PaintOutsidePaintEvent атрибут установлен. В Mac OS X и Windows, вы можете рисовать только в функция paintEvent () независимо от настройка этого атрибута.

3 голосов
/ 09 июня 2011

Вы не правильно рисуете виджеты.

Правильный способ сделать это так:

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

... и это единственное место, где вы должны бытьиспользуя QPainter.Затем всякий раз, когда вы хотите, чтобы ваш виджет перекрасился, вызовите update () для вашего виджета, и вскоре после этого Qt вызовет paintEvent () для вас.

2 голосов
/ 09 июня 2011

Сначала позвоните show(), как предложено Мартином Беккетом. Во-вторых, вы не можете позвонить paintEvent() самостоятельно. Вам нужно переопределить paintEvent() и рисовать там. Пожалуйста, посмотрите пример, который я привел в этом ответе .

2 голосов
/ 09 июня 2011

Вам нужно показать окно

Window w;
w.show()
return app.exec();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...