Название: Соединение виджетов в пользовательском классе (решено)
Отправлено: Elidar от Январь 20, 2013, 16:40
Моя проблемка: необходимо создать свой класс-коллекцию виджетов, проставить связи, вывести на окно. (в данном случае соединяю 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 к элементам приватного массива в классе. Как можно это решить, минимально меняя структуру проекта?
Название: Re: Соединение виджетов в пользовательском классе
Отправлено: Old от Январь 20, 2013, 16:45
C++ (Qt) // for (int i = 0; i <= Example.getSize(); i++) // Выходишь за границы массива for (int i = 0; i < Example.getSize(); i++) { layout -> addWidget (Example[i]); }
Название: Re: Соединение виджетов в пользовательском классе
Отправлено: Elidar от Январь 20, 2013, 16:49
Благодарю, от ошибки помогло. Но виджеты не оторбражаются.. о_О
Название: Re: Соединение виджетов в пользовательском классе
Отправлено: Elidar от Январь 20, 2013, 16:52
Всё, всё работает, тем закрыта, благодарю.)
|