Russian Qt Forum
Ноябрь 23, 2024, 20:59 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Соединение виджетов в пользовательском классе (решено)  (Прочитано 2181 раз)
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 к элементам приватного массива в классе.
Как можно это решить, минимально меняя структуру проекта?
« Последнее редактирование: Январь 20, 2013, 16:53 от Elidar » Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #1 : Январь 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]);
}
 
« Последнее редактирование: Январь 20, 2013, 16:47 от Old » Записан
Elidar
Гость
« Ответ #2 : Январь 20, 2013, 16:49 »

Благодарю, от ошибки помогло.
Но виджеты не оторбражаются.. о_О
Записан
Elidar
Гость
« Ответ #3 : Январь 20, 2013, 16:52 »

Всё, всё работает, тем закрыта, благодарю.)
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.063 секунд. Запросов: 23.