Моя проблемка: необходимо создать свой класс-коллекцию виджетов, проставить связи, вывести на окно. (в данном случае соединяю Spin, Slider, ScrollBar и значение Label, чтобы при изменении одного всё остальное так же изменялось)
MyClassArr.h#include <QtGui/QApplication>
#include <QtGlobal>
#include <iostream>
#include <qlist.h>
#include <QtGui>
class StackOverFlow{};
class StackUnderFlow{};
class StackOutOfRange{};
#pragma once
class MyClassArr
{
private:
int max_size;
int top;
QWidget* *widget;
public:
MyClassArr(int max_size)
{
widget=new QWidget*[max_size];
top=0;
};
void Push (QWidget* w)
{
if (top>max_size) throw StackOverFlow();
widget[top] = w;
top++;
};
QWidget* Pop()
{
if (top==0) throw StackUnderFlow();
top--;
QWidget* tmp=widget[top];
return tmp;
};
int getSize()
{
return top;
};
int maxSize()
{
return max_size;
};
void makeConnections()
{
for (int i=0; i<=top/2; i++ )
{
if(widget[i+1]->metaObject()->className() == QString("QLabel"))
{
Q_ASSERT(QObject::connect(widget[i],SIGNAL(valueChanged(int)), widget[i+1], SLOT(setNum(int))));
}
else
{
Q_ASSERT(QObject::connect(widget[i], SIGNAL(valueChanged(int)), widget[i+1], SLOT(setValue(int))));
Q_ASSERT(QObject::connect(widget[i+1], SIGNAL(valueChanged(int)), widget[i], SLOT(setValue(int))));
}
}
}
QWidget*& operator[](int index)
{
if ((index<0)||(index>top)) throw StackOutOfRange(); return widget[index];
};
~MyClassArr(){};
};
main.cpp#include "myclass.h"
#include "MyClassArr.h"
#include <iostream>
#include <QtGui/QApplication>
#include <qlist.h>
#include <QtGui>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QWidget *window = new QWidget;
window->setMinimumSize(400, 320);
QSpinBox *spin = new QSpinBox;
QSlider *slider = new QSlider;
QLabel *label = new QLabel;
QScrollBar *scrollbar = new QScrollBar;
QHBoxLayout *layout = new QHBoxLayout;
spin->setRange(0, 100);
scrollbar->setRange(0, 100);
slider->setRange(0, 100);
int n=10;
MyClassArr Example(n);
Example.Push(spin);
Example.Push(slider);
Example.Push(scrollbar);
Example.Push(label);
Example.makeConnections();
for (int i = 0; i <= Example.getSize(); i++)
{
layout -> addWidget (Example[i]);
}
window -> show();
return a.exec();
}
Всё это дело выдает runtime-ошибку с текстом
Unhandled exception at 0x5220850c (QtCored4.dll) in QtVSProject.exe: 0xC0000005: Access violation reading location 0xcdcdcdd1.
Из Qt-шного файла
qscopedpointer.h, по тексту
inline T *operator->() const
{
Q_ASSERT(d);
return d;
}
Подозреваю, что это связано с тем, что я привязываю valueChanged к элементам приватного массива в классе.
Как можно это решить, минимально меняя структуру проекта?