Добрый день.
Нужна помощь, не могу разобраться сам.
Итак, есть самый обыкновенный виджет:
#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