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