crossplatform.ru

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


  Ответ в Не работает paintEvent
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
iReset Дата 14.1.2013, 5:48
  Переменная myClass, на которую указывает p_myClass, - локальная, уничтожается при выходе из конструктора MainWidget, отсюда мусор при работе с p_myClass.
Про p_masterClass ничего сказать по приведенному коду не могу.
QMainWindow Дата 13.1.2013, 12:38
  Добрый день.
Нужна помощь, не могу разобраться сам.
Итак, есть самый обыкновенный виджет:
Раскрывающийся текст
#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_... являются приватными, и соответствующие классы объявлены друзьями).
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 24.4.2024, 19:24