crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Не работает paintEvent, Почему?
QMainWindow
  опции профиля:
сообщение 13.1.2013, 12:38
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 198
Регистрация: 1.8.2010
Пользователь №: 1922

Спасибо сказали: 0 раз(а)




Репутация:   0  


Добрый день.
Нужна помощь, не могу разобраться сам.
Итак, есть самый обыкновенный виджет:
Раскрывающийся текст
#include "mainwidget.h"
#include "cmath"

MainWidget::MainWidget(QWidget *parent) : QWidget(parent)
{
    this->resize(1200,640);
    masterClass = new MasterClass(0, 0, width(), height(), this); //Про этот класс см. ниже
    double Xmax = 100;
    double dx = 0.01;
    double x = -Xmax/2, y;
    for(int i=0; i<Xmax/dx+2; i++, x = x+dx)
    {
        y = 2*exp(-(x/2)*(x/2));
        Y.append(QPointF(x, y));
    }
    MyClass myClass(Y);  //Про этот класс см. ниже
    masterClass ->setMyClass(myClass);
}
Простой код, без наворотов. Инклюды этих классов сделаны в заголовочном файле.
Далее, идем по строкам кода. Сначала создается объект masterClass. Его конструктор:
Раскрывающийся текст
#include "MasterClass.h"
#include <QDebug>

MasterClass::MasterClass(int x, int y, int width, int height, QWidget *parent) : QWidget(parent)
{
    ... //Тут идет присвоение переменных, например this->obj_x = x;
    this->setGeometry(x, y, width, height);
    this->show();
}
Далее создается объект myClass. Его реализация:
Раскрывающийся текст
#include "MyClass.h"
#include "MasterClass.h"

MyClass::MyClass(QVector<QPointF> &points, QColor color, unsigned int thickness, LineStyle style)
{
    if(!points.isEmpty())
    {
        for(int i = 0; i<points.size(); i++)
        {
            p_X.append(points.value(i).x());
            p_Y.append(points.value(i).y());
        }
        p_xMax = points.last().x();
        p_xMin = points.first().x();
        p_yMax = MasterClass::globalMaximum(points);
        p_yMin = MasterClass::globalMinimum(points);
    }
    else p_xMax = p_xMin = p_yMax = p_yMin = 0;

    p_color = color; //
    p_thickness = thickness;//
    p_style = style;// Эти три параметра, не указанные при создании объекта, принимают значения по умолчанию.
    p_stride = 0;
}

Далее выполняется метод. Его код:
Раскрывающийся текст
void MasterClass::setMyClass(MyClass& myClass)
{
    p_List.append(&myClass);
    
    PrivateMyClass *privateMyClass = new PrivateMyClass(&myClass, this);
    p_privateList.append(privateMyClass);
}

Реализация PrivateMyClass:
Раскрывающийся текст
#include "PrivateMyClass.h"
#include "MasterClass.h"
#include "MyClass.h"
#include <QDebug>

PrivateMyClass::PrivateMyClass(MyClass *myClass, MasterClass *masterClass) : QWidget(masterClass)
{
    this->setGeometry(masterClass->p_leftMargin, masterClass->p_topMargin, masterClass->width() - masterClass->p_leftMargin - masterClass->p_rightMargin,
                      masterClass->height() - masterClass->p_topMargin - masterClass->p_bottomMargin);
    p_masterClass = masterClass;
    p_myClass = myClass;

    qDebug()<<p_masterClass->p_KX<<" "<<p_masterClass->p_xMin<<" "<<p_masterClass->p_KY<<" "<<p_masterClass->p_yMax; //11.5988   -50   580   2               Верные значения!
    qDebug()<<p_myClass ->p_X.size(); //10002            Верное значение!
    qDebug()<<p_myClass ->p_stride<<" "<<p_myClass ->p_X.size()<<" "<<p_myClass ->p_style; //0   10002   QFlags(0x1)              Верные значения!
}

void PrivateMyClass::paintEvent(QPaintEvent *e)
{
    QPainter p(this);
    p.setRenderHint(QPainter::Antialiasing, p_masterClass->p_antialiasing);
    QMatrix p_matrix(1,0,0,-1, -p_masterClass->p_KX*p_masterClass->p_xMin, p_masterClass->p_KY*p_masterClass->p_yMax);
    p.setMatrix(p_matrix);
    p.setPen(QPen(p_myClass->p_color, p_myClass->p_thickness));

    int size = p_myClass->p_X.size();

    qDebug()<<p_masterClass->p_KX<<" "<<p_masterClass->p_xMin<<" "<<p_masterClass->p_KY<<" "<<p_masterClass->p_yMax;  //-0.39996   -50   -20   2           Брехня! (кроме 2го и 4го почему-то...)
    qDebug()<<p_myClass ->p_X.size(); //0               Брехня!
    qDebug()<<p_myClass ->p_stride<<" "<<p_myClass ->p_X.size()<<" "<<p_myClass ->p_style;  //1776097520   0     QFlags(0x4|0x8|0x10|0x20|0x40|0x80|0x100|0x400|0x800|0x1000|0x2000|0x4000|0x8000|0x
80000|0x200000)             Брехня!


    switch(p_myClass->p_style)
    {
    case MyClass::Style1:
        //Рисуем тут.          
        break;

    case ... //И т.д.
    }
}
Вот его .h файл:
Раскрывающийся текст
#ifndef PRIVATEMYCLASS_H
#define PRIVATEMYCLASS_H

#include <QWidget>
#include <QPainter>

class MasterClass;
class MyClass;

class PrivateMyClass : public QWidget
{
    Q_OBJECT
public:
    explicit PrivateMyClass(MyClass *myClass, MasterClass *masterClass);
protected:
    void paintEvent(QPaintEvent *e);
private:
    MasterClass *p_masterClass;
    MyClass *p_myClass;
};

#endif // PRIVATEMYCLASS_H
В общем, почему qDebug(), вызванный в paintEvent говорит бред, тогда как в конструкторе он говорит правду? При этом конструктор вызывается раньше, и это значит, что все значения уже посчитаны (все эти значения p_... являются приватными, и соответствующие классы объявлены друзьями).

Сообщение отредактировал QMainWindow - 13.1.2013, 12:42
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
iReset
  опции профиля:
сообщение 14.1.2013, 5:48
Сообщение #2


Участник
**

Группа: Участник
Сообщений: 178
Регистрация: 6.6.2012
Пользователь №: 3414

Спасибо сказали: 23 раз(а)




Репутация:   2  


Переменная myClass, на которую указывает p_myClass, - локальная, уничтожается при выходе из конструктора MainWidget, отсюда мусор при работе с p_myClass.
Про p_masterClass ничего сказать по приведенному коду не могу.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 29.1.2020, 18:54