can't start class in class
-
can't start class in class .
I draw a 2D picture. Created this primitive circle. BUT I can’t call it.here is all the code
QT += core gui greaterThan(QT_MAJOR_VERSION, 4): QT += widgets TARGET = tank TEMPLATE = app # The following define makes your compiler emit warnings if you use # any feature of Qt which has been marked as deprecated (the exact warnings # depend on your compiler). Please consult the documentation of the # deprecated API in order to know how to port your code away from it. DEFINES += QT_DEPRECATED_WARNINGS # You can also make your code fail to compile if you use deprecated APIs. # In order to do so, uncomment the following line. # You can also select to disable deprecated APIs only up to a certain version of Qt. #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 SOURCES += \ main.cpp \ tank.cpp \ krug_qt.cpp HEADERS += \ tank.h \ krug_qt.h
krug_qt.h
#ifndef KRUG_QT_H #define KRUG_QT_H #include <QMainWindow> #include <QDebug> #include <QPainter> #include <QPen> #include <QFont> #include <QtMath> #include <QPointF> #include <QResizeEvent> #include <QGridLayout> // структура для отрисовки круга struct strKryg { strKryg() { R = 0.0; kol_toch = 0; tocka_1 = 0; tocka_2 = 0; X = 0.0; Y = 0.0; integerVector.clear(); } float R; // радиус int kol_toch; // колич точек которые будут формировать круг int tocka_1; // точка выреза начало int tocka_2; // точка выреза конец float X; float Y; // расположение икса и игрика QVector<float> integerVector; // вектор куда кладём точки (Х и У) }; class Krug_qt : public QWidget { Q_OBJECT public: Krug_qt(QWidget *parent = 0); ~Krug_qt(); void krygVertexArray(); void vvodZnach(float R, int kol_toch); void vvodZnach(float R, int kol_toch, float X, float Y); void vvodZnach(float R, int kol_toch, int tocka_1, int tocka_2, float X, float Y); protected: void paintEvent(QPaintEvent *event); strKryg _mytKrg; // структура круга }; #endif // KRUG_QT_H
tank.h
#ifndef TANK_H #define TANK_H #include <QMainWindow> #include <QDebug> #include <QPainter> #include <QPen> #include <QFont> #include <QFontMetrics> #include <QKeyEvent> #include <QRegion> #include <QPointF> #include <QGraphicsView> #include <QtMath> #include <QRectF> #include <QBoxLayout> #include <QResizeEvent> #include "krug_qt.h" struct texnStructur { texnStructur() // сразу же заполняем его нулями { podves_znach_1 = false; podves_znach_2 = false; // m_t_pitch = 0; m_pitch =0; for(uint i=0; i < sizeof(m_t_razm)/ sizeof(m_t_razm[0]); i++) m_t_razm[i] = 0; } /*** m_t_razm[0] - отступ по Х (окно) m_t_razm[1] - отступ по У (окно) m_t_razm[2] - ширина (окно) m_t_razm[3] - высота (окно) m_t_razm[4] - ширина танка m_t_razm[5] - высота танка m_t_razm[6] - диаметр башни m_t_razm[7] - ширина и высота квадрада эмулир "подвесы" m_t_razm[8] - длинна пушки m_t_razm[9] - переменная размера шрифта текста m_t_razm[10] - m_pitch переменная для положения на градусной ленте m_t_razm[11] - razm_shrift переменная размера шрифта текста компаса ***/ float m_t_razm[12]; bool podves_znach_1; // переменные для значения подвесов bool podves_znach_2; }; class Tank : public QMainWindow { Q_OBJECT public: Tank(QWidget *parent = 0); ~Tank(); QWidget* centralWidget; QGridLayout* layout; void razmer_tank(int x, int y); protected: void paintEvent(QPaintEvent *event); void keyPressEvent(QKeyEvent *event); texnStructur _myTexpr; // обьявляем его strKryg _mytKrg; // структура круга private: Krug_qt* krug; }; #endif // TANK_H
krug_qt.cpp
#include "krug_qt.h" Krug_qt::Krug_qt(QWidget *parent) { } Krug_qt::~Krug_qt() { } void Krug_qt::krygVertexArray() { float grad = 360.0/_mytKrg.kol_toch; float grad_kol_toch = 0.0; // градусы*M_PI/180 = радианы int j; for (j = 0; j < _mytKrg.kol_toch; ++j){ _mytKrg.integerVector.append(_mytKrg.R * cos(grad_kol_toch*M_PI/180.0)); _mytKrg.integerVector.append(_mytKrg.R * sin(grad_kol_toch*M_PI/180.0)); grad_kol_toch = grad_kol_toch + grad; } } void Krug_qt::vvodZnach(float R, int kol_toch) { _mytKrg.R = R; _mytKrg.kol_toch = kol_toch; _mytKrg.tocka_1 = 0; _mytKrg.tocka_2 = 0; _mytKrg.X = 0.0; _mytKrg.Y = 0.0; } void Krug_qt::vvodZnach(float R, int kol_toch, float X, float Y) { _mytKrg.R = R; _mytKrg.kol_toch = kol_toch; _mytKrg.tocka_1 = 0; _mytKrg.tocka_2 = 0; _mytKrg.X = X; _mytKrg.Y = Y; } void Krug_qt::vvodZnach(float R, int kol_toch, int tocka_1, int tocka_2, float X, float Y) { _mytKrg.R = R; _mytKrg.kol_toch = kol_toch; _mytKrg.tocka_1 = tocka_1; _mytKrg.tocka_2 = tocka_2; _mytKrg.X = X; _mytKrg.Y = Y; } void Krug_qt::paintEvent(QPaintEvent *event) { QPainter painter(this); // Создаём объект отрисовщика QPen pen_abris(Qt::black, 2, Qt::SolidLine, Qt::FlatCap); // кисть обрисовки (компаса) painter.setRenderHint(QPainter::Antialiasing); // убираем резкие кубики painter.setPen(pen_abris); // Устанавливаем кисть обрисовки krygVertexArray(); // Набираем массив int i; bool d_t; // используемые переменные d_t = true; i = 0; // ТОЧКА ОТРИСОВКИ for( ; i<_mytKrg.kol_toch; ++i) { if(i > _mytKrg.tocka_1) // угол "вырезания" начало { d_t = false; if( i < _mytKrg.tocka_2) // угол "вырезания" конец { _mytKrg.tocka_1 = i*2; d_t = true; } } if(d_t == true) { // это отдельно все работает полноценный круг _mytKrg.tocka_2 = _mytKrg.tocka_1+1; painter.drawPoint(QPointF(_mytKrg.X+_mytKrg.integerVector[_mytKrg.tocka_1],_mytKrg.Y+_mytKrg.integerVector[_mytKrg.tocka_2])); _mytKrg.tocka_1 = _mytKrg.tocka_1 +2; } } }
main.cpp
#include "tank.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); Tank w; w.show(); return a.exec(); }
tank.cpp
#include "tank.h" Tank::Tank(QWidget *parent) : QMainWindow(parent) { krug = new Krug_qt(this); centralWidget = new QWidget; setCentralWidget(centralWidget); layout= new QGridLayout; centralWidget->setLayout(layout); layout->addWidget(krug); } Tank::~Tank() { } void Tank::paintEvent(QPaintEvent *event) { QPainter painter(this); // Создаём объект отрисовщика painter.setRenderHint(QPainter::Antialiasing); // убираем резкие кубики QPen pen_osn(Qt::black, 2, Qt::SolidLine, Qt::FlatCap); // кисть для основного тела QPen pen_bashn(Qt::black, 4, Qt::SolidLine, Qt::FlatCap); // кисть для башни razmer_tank(this->width(), this->height()); // выставляем размеры painter.setPen(pen_osn); // Устанавливаем кисть для линий и текста // рисуем корпус painter.drawLine(_myTexpr.m_t_razm[0], _myTexpr.m_t_razm[1], _myTexpr.m_t_razm[0], _myTexpr.m_t_razm[1]+_myTexpr.m_t_razm[5]); painter.drawLine(_myTexpr.m_t_razm[0], _myTexpr.m_t_razm[1]+_myTexpr.m_t_razm[5], _myTexpr.m_t_razm[0]+_myTexpr.m_t_razm[4],_myTexpr.m_t_razm[1]+_myTexpr.m_t_razm[5]); painter.drawLine(_myTexpr.m_t_razm[0]+_myTexpr.m_t_razm[4], _myTexpr.m_t_razm[1], _myTexpr.m_t_razm[0]+_myTexpr.m_t_razm[4], _myTexpr.m_t_razm[1]+_myTexpr.m_t_razm[5]); painter.drawLine(_myTexpr.m_t_razm[0]+_myTexpr.m_t_razm[4], _myTexpr.m_t_razm[1], _myTexpr.m_t_razm[0]+_myTexpr.m_t_razm[4]/2, _myTexpr.m_t_razm[1]+ _myTexpr.m_t_razm[1]*cos(8)); painter.drawLine(_myTexpr.m_t_razm[0]+_myTexpr.m_t_razm[4]/2.0, _myTexpr.m_t_razm[1]+ _myTexpr.m_t_razm[1]*cos(8), _myTexpr.m_t_razm[0], _myTexpr.m_t_razm[1]); painter.setPen(pen_bashn); // Устанавливаем кисть для пушек и обвесов // рисуем пушку и башню //// Создать свою арку. Именно свою функцию на флоотах krug->vvodZnach(_myTexpr.m_t_razm[5], 90, _myTexpr.m_t_razm[2], _myTexpr.m_t_razm[3]); krug->update(); painter.drawLine(_myTexpr.m_t_razm[0]+_myTexpr.m_t_razm[4]/2, _myTexpr.m_t_razm[1]+_myTexpr.m_t_razm[5]/3.2-_myTexpr.m_t_razm[6]/2.5, _myTexpr.m_t_razm[0]+_myTexpr.m_t_razm[4]/2, _myTexpr.m_t_razm[1]-_myTexpr.m_t_razm[1]*0.2); // перемещаем позицию отрисовки а также проворачиваем (угол в другой системме кординат) // для отрисовки "подвесов" painter.translate(_myTexpr.m_t_razm[0]+_myTexpr.m_t_razm[4]/2+(_myTexpr.m_t_razm[7]*1.3), _myTexpr.m_t_razm[1]+_myTexpr.m_t_razm[5]/3.2-_myTexpr.m_t_razm[6]/2.5); painter.rotate(45.0); painter.drawRect(0,0,_myTexpr.m_t_razm[7], _myTexpr.m_t_razm[7]); painter.rotate(-45.0); // возвращаем позицию отрисовки (мировых координат) painter.translate(-(_myTexpr.m_t_razm[0]+_myTexpr.m_t_razm[4]/2+(_myTexpr.m_t_razm[7]*1.3)), -(_myTexpr.m_t_razm[1]+_myTexpr.m_t_razm[5]/3.2-_myTexpr.m_t_razm[6]/2.5)); painter.translate(_myTexpr.m_t_razm[0]+_myTexpr.m_t_razm[4]/2-(_myTexpr.m_t_razm[7]*1.3), _myTexpr.m_t_razm[1]+_myTexpr.m_t_razm[5]/3.2-_myTexpr.m_t_razm[6]/2.5); painter.rotate(45.0); painter.drawRect(0,0,_myTexpr.m_t_razm[7], _myTexpr.m_t_razm[7]); painter.rotate(-45.0); // возвращаем позицию отрисовки (мировых координат) painter.translate(-(_myTexpr.m_t_razm[0]+_myTexpr.m_t_razm[4]/2-(_myTexpr.m_t_razm[7]*1.3)), -(_myTexpr.m_t_razm[1]+_myTexpr.m_t_razm[5]/3.2-_myTexpr.m_t_razm[6]/2.5)); QString ctroka; // строка для вывода цифр QFont razm_shrift("Areal", _myTexpr.m_t_razm[9], QFont::Light); // свойства шрифта painter.setFont(razm_shrift); // устанавливаем размер шрифта QFontMetrics stroka_razm = painter.fontMetrics(); // метрика шрифта // Вот тут текст ctroka = "RPM \n 50"; painter.drawText(_myTexpr.m_t_razm[0]*0.96, _myTexpr.m_t_razm[1]+_myTexpr.m_t_razm[5]/3.8, _myTexpr.m_t_razm[7]*2.0,_myTexpr.m_t_razm[7]*2,0,ctroka,nullptr); painter.drawText(_myTexpr.m_t_razm[0]*1.12, _myTexpr.m_t_razm[1]+_myTexpr.m_t_razm[5]/3.8, _myTexpr.m_t_razm[7]*2.0,_myTexpr.m_t_razm[7]*2,0,ctroka,nullptr); } void Tank::keyPressEvent(QKeyEvent *event) { switch (event->key()) { case Qt::Key_F: _myTexpr.podves_znach_1 = ! _myTexpr.podves_znach_1; break; case Qt::Key_G: _myTexpr.podves_znach_2 = ! _myTexpr.podves_znach_2; break; default: QWidget::keyPressEvent(event); break; } } void Tank::razmer_tank(int x, int y) { // m_t_razm[0] - отступ по Х (окно) // m_t_razm[1] - отступ по У (окно) // m_t_razm[2] - ширина (окно) // m_t_razm[3] - высота (окно) // m_t_razm[4] - ширина танка // m_t_razm[5] - высота танка // m_t_razm[6] - диаметр башни // m_t_razm[7] - ширина и высота квадрада эмулир "подвесы" // m_t_razm[8] - длинна пушки // m_t_razm[8] - размер текста // m_t_razm[9] - переменная размера шрифта текста _myTexpr.m_t_razm[0] = x/1.25; // начало (отступ по х) х1 _myTexpr.m_t_razm[1] = y/3.0; // начало (отступ по y) y1 _myTexpr.m_t_razm[2] = x/3.0; // ширина (окно) _myTexpr.m_t_razm[3] = y/3.0; // высота (окно) _myTexpr.m_t_razm[4] = x/12.0; // ширина танка _myTexpr.m_t_razm[5] = y/4.5; // высота танка _myTexpr.m_t_razm[6] = (x/12.0+y/12.0)/2.0; // диаметр башни _myTexpr.m_t_razm[7] = (x/10.0+y/10.0)/10.0; // ширина и высота квадрада эмулир "подвесы" _myTexpr.m_t_razm[8] = y/6.0; // длинна пушки _myTexpr.m_t_razm[9] = (y+x)/200.0; // размер текста }
I am calling the Krug_qt class. But I can't change its location and also pull it out several times
-
@timob256 said in can't start class in class:
But I can't change its location and also pull it out several times
I really have no idea what this means.
Can you please explain better?
What does "can't start class in class" mean?
What EXACTLY does not work? -
@JonB said in can't start class in class:
tank.h needs #include "krug_qt.h"
He has, as far as I can see....
@timob256 said in can't start class in class:
I cannot call the krug_qt class in the tank class
What do you mean by "call"? Does it mean the values dont update when you call this function from
tank
class?!In
tank.cpp
you create an instance ofkrug_qt
#include "tank.h" Tank::Tank(QWidget *parent) : QMainWindow(parent) { krug = new Krug_qt(this);
So this should work, right?!